[{"data":1,"prerenderedAt":682},["ShallowReactive",2],{"navigation":3,"post-\u002Fposts\u002F2012\u002Fandroid-unit-test":20,"surroundPosts-\u002Fposts\u002F2012\u002Fandroid-unit-test":669},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",{"id":21,"title":22,"body":23,"class":649,"cover":649,"coverSize":649,"date":650,"description":29,"draft":651,"extension":652,"hideComments":651,"location":653,"meta":654,"navigation":384,"path":655,"readingTime":656,"seo":661,"sitemap":662,"stem":663,"tags":664,"time":667,"weather":649,"__hash__":668},"posts\u002Fposts\u002F2012\u002F20120731.android-unit-test.md","Android 单元测试",{"type":24,"value":25,"toc":647},"minimark",[26,30,33,36,39,47,50,57,64,113,118,190,193,275,278,284,313,316,618,621,624,627,631,634,637,640,643],[27,28,29],"p",{},"今天终于向让我退缩了很久的单元测试前进了一步。",[27,31,32],{},"很早就知道 Android 里可以建立测试项目，但我一直不明白怎么去用，也总觉得我的这些个小项目，需要用到测试这么高端的东西吗？今天突然对之前搁置很久的全能计算器的重构有了一些灵感，写了个计算专用的工具类，然而，之前项目中有不少错误，现在是没法运行的，于是，我只想对这个工具类进行测试，怎么做呢？",[27,34,35],{},"如果不用单元测试的话，得先把整个项目的错误改掉，编译成功，然后通过日志输出的方式来测试那个类，但相当繁琐。如果使用单元测试的话，就相当轻松啦。",[27,37,38],{},"Android 里的单元测试有两种方式，一种是建立一个新的测试项目（Android Test Project），那个似乎是对整个项目进行测试的，没有仔细去了解，还是比较庞大，跟我们这里的要求不符。",[27,40,41,42,46],{},"另一种方式，则是在需要测试的项目里新建一个测试类，继承 ",[43,44,45],"code",{},"AndroidTestCase","，然后运行时使用 Android JUnit Test 的方式运行就可以了。",[27,48,49],{},"下面开始看代码：",[27,51,52,53,56],{},"首先，需要对项目的 ",[43,54,55],{},"AndroidManifest.xml"," 文件进行一些改动",[27,58,59,60,63],{},"在 ",[43,61,62],{},"\u003Capplication>"," 结点里加入：",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-xml shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cuses-library android:name=\"android.test.runner\" \u002F>\n","xml","",[43,72,73],{"__ignoreMap":70},[74,75,78,82,86,90,94,97,100,104,108,110],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sP7_E","\u003C",[74,83,85],{"class":84},"sQzsp","uses-library",[74,87,89],{"class":88},"s9AJx"," android",[74,91,93],{"class":92},"stp6e",":",[74,95,96],{"class":88},"name",[74,98,99],{"class":80},"=",[74,101,103],{"class":102},"sjJ54","\"",[74,105,107],{"class":106},"s_sjI","android.test.runner",[74,109,103],{"class":102},[74,111,112],{"class":80}," \u002F>\n",[27,114,59,115,117],{},[43,116,62],{}," 结点外加入：",[65,119,121],{"className":67,"code":120,"language":69,"meta":70,"style":70},"\u003Cinstrumentation\n    android:name=\"android.test.InstrumentationTestRunner\"\n    android:label=\"Test\"\n    android:targetPackage=\"你的包名\" \u002F>\n",[43,122,123,130,150,169],{"__ignoreMap":70},[74,124,125,127],{"class":76,"line":77},[74,126,81],{"class":80},[74,128,129],{"class":84},"instrumentation\n",[74,131,133,136,138,140,142,144,147],{"class":76,"line":132},2,[74,134,135],{"class":88},"    android",[74,137,93],{"class":92},[74,139,96],{"class":88},[74,141,99],{"class":80},[74,143,103],{"class":102},[74,145,146],{"class":106},"android.test.InstrumentationTestRunner",[74,148,149],{"class":102},"\"\n",[74,151,153,155,157,160,162,164,167],{"class":76,"line":152},3,[74,154,135],{"class":88},[74,156,93],{"class":92},[74,158,159],{"class":88},"label",[74,161,99],{"class":80},[74,163,103],{"class":102},[74,165,166],{"class":106},"Test",[74,168,149],{"class":102},[74,170,172,174,176,179,181,183,186,188],{"class":76,"line":171},4,[74,173,135],{"class":88},[74,175,93],{"class":92},[74,177,178],{"class":88},"targetPackage",[74,180,99],{"class":80},[74,182,103],{"class":102},[74,184,185],{"class":106},"你的包名",[74,187,103],{"class":102},[74,189,112],{"class":80},[27,191,192],{},"注意，此处的包名一定要与最上方的",[65,194,196],{"className":67,"code":195,"language":69,"meta":70,"style":70},"\u003Cmanifest xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\"\n    package=\"包名\"\n    android:versionCode=\"版本号\"\n    android:versionName=\"版本名\" >\n",[43,197,198,222,236,254],{"__ignoreMap":70},[74,199,200,202,205,208,210,213,215,217,220],{"class":76,"line":77},[74,201,81],{"class":80},[74,203,204],{"class":84},"manifest",[74,206,207],{"class":88}," xmlns",[74,209,93],{"class":92},[74,211,212],{"class":88},"android",[74,214,99],{"class":80},[74,216,103],{"class":102},[74,218,219],{"class":106},"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid",[74,221,149],{"class":102},[74,223,224,227,229,231,234],{"class":76,"line":132},[74,225,226],{"class":88},"    package",[74,228,99],{"class":80},[74,230,103],{"class":102},[74,232,233],{"class":106},"包名",[74,235,149],{"class":102},[74,237,238,240,242,245,247,249,252],{"class":76,"line":152},[74,239,135],{"class":88},[74,241,93],{"class":92},[74,243,244],{"class":88},"versionCode",[74,246,99],{"class":80},[74,248,103],{"class":102},[74,250,251],{"class":106},"版本号",[74,253,149],{"class":102},[74,255,256,258,260,263,265,267,270,272],{"class":76,"line":171},[74,257,135],{"class":88},[74,259,93],{"class":92},[74,261,262],{"class":88},"versionName",[74,264,99],{"class":80},[74,266,103],{"class":102},[74,268,269],{"class":106},"版本名",[74,271,103],{"class":102},[74,273,274],{"class":80}," >\n",[27,276,277],{},"这里的包名一致。",[27,279,280,281,283],{},"同时，还需要添加权限，也在 ",[43,282,62],{}," 外：",[65,285,287],{"className":67,"code":286,"language":69,"meta":70,"style":70},"\u003Cuses-permission android:name=\"android.permission.RUN_INSTRUMENTATION\" \u002F>\n",[43,288,289],{"__ignoreMap":70},[74,290,291,293,296,298,300,302,304,306,309,311],{"class":76,"line":77},[74,292,81],{"class":80},[74,294,295],{"class":84},"uses-permission",[74,297,89],{"class":88},[74,299,93],{"class":92},[74,301,96],{"class":88},[74,303,99],{"class":80},[74,305,103],{"class":102},[74,307,308],{"class":106},"android.permission.RUN_INSTRUMENTATION",[74,310,103],{"class":102},[74,312,112],{"class":80},[27,314,315],{},"下面，新建一个类，我是新建的一个 CalcTest 类，用来测试 Calc 类的运行情况：",[65,317,321],{"className":318,"code":319,"language":320,"meta":70,"style":70},"language-java shiki shiki-themes material-theme-lighter github-light github-dark","public class CalcTest extends AndroidTestCase\n{\n    private static final String TAG = \"CalcTest\";\n\n    public void testPlus()\n    {\n        String answer = Calc.add(\"1.31\", \"4.63\");\n        Log.i(TAG, answer);\n        Assert.assertEquals(\"5.94\", answer);\n    }\n\n    public void testMinus()\n    {\n        String answer = Calc.subtract(\"1.7\", \"1.6\");\n        Log.i(TAG, answer);\n        Assert.assertEquals(\"0.1\", answer);\n    }\n}\n","java",[43,322,323,342,347,380,386,402,408,451,474,500,506,511,523,528,564,583,607,612],{"__ignoreMap":70},[74,324,325,329,332,336,339],{"class":76,"line":77},[74,326,328],{"class":327},"sbsja","public",[74,330,331],{"class":327}," class",[74,333,335],{"class":334},"sbgvK"," CalcTest",[74,337,338],{"class":327}," extends",[74,340,341],{"class":334}," AndroidTestCase\n",[74,343,344],{"class":76,"line":132},[74,345,346],{"class":80},"{\n",[74,348,349,352,355,358,362,366,369,372,375,377],{"class":76,"line":152},[74,350,351],{"class":327},"    private",[74,353,354],{"class":327}," static",[74,356,357],{"class":327}," final",[74,359,361],{"class":360},"s_bVq"," String",[74,363,365],{"class":364},"su5hD"," TAG ",[74,367,99],{"class":368},"smGrS",[74,370,371],{"class":102}," \"",[74,373,374],{"class":106},"CalcTest",[74,376,103],{"class":102},[74,378,379],{"class":80},";\n",[74,381,382],{"class":76,"line":171},[74,383,385],{"emptyLinePlaceholder":384},true,"\n",[74,387,389,392,395,399],{"class":76,"line":388},5,[74,390,391],{"class":327},"    public",[74,393,394],{"class":327}," void",[74,396,398],{"class":397},"sGLFI"," testPlus",[74,400,401],{"class":80},"()\n",[74,403,405],{"class":76,"line":404},6,[74,406,407],{"class":80},"    {\n",[74,409,411,414,417,419,422,425,428,431,433,436,438,441,443,446,448],{"class":76,"line":410},7,[74,412,413],{"class":360},"        String",[74,415,416],{"class":364}," answer ",[74,418,99],{"class":368},[74,420,421],{"class":364}," Calc",[74,423,424],{"class":80},".",[74,426,427],{"class":397},"add",[74,429,430],{"class":80},"(",[74,432,103],{"class":102},[74,434,435],{"class":106},"1.31",[74,437,103],{"class":102},[74,439,440],{"class":80},",",[74,442,371],{"class":102},[74,444,445],{"class":106},"4.63",[74,447,103],{"class":102},[74,449,450],{"class":80},");\n",[74,452,454,457,459,462,464,467,469,472],{"class":76,"line":453},8,[74,455,456],{"class":364},"        Log",[74,458,424],{"class":80},[74,460,461],{"class":397},"i",[74,463,430],{"class":80},[74,465,466],{"class":364},"TAG",[74,468,440],{"class":80},[74,470,471],{"class":364}," answer",[74,473,450],{"class":80},[74,475,477,480,482,485,487,489,492,494,496,498],{"class":76,"line":476},9,[74,478,479],{"class":364},"        Assert",[74,481,424],{"class":80},[74,483,484],{"class":397},"assertEquals",[74,486,430],{"class":80},[74,488,103],{"class":102},[74,490,491],{"class":106},"5.94",[74,493,103],{"class":102},[74,495,440],{"class":80},[74,497,471],{"class":364},[74,499,450],{"class":80},[74,501,503],{"class":76,"line":502},10,[74,504,505],{"class":80},"    }\n",[74,507,509],{"class":76,"line":508},11,[74,510,385],{"emptyLinePlaceholder":384},[74,512,514,516,518,521],{"class":76,"line":513},12,[74,515,391],{"class":327},[74,517,394],{"class":327},[74,519,520],{"class":397}," testMinus",[74,522,401],{"class":80},[74,524,526],{"class":76,"line":525},13,[74,527,407],{"class":80},[74,529,531,533,535,537,539,541,544,546,548,551,553,555,557,560,562],{"class":76,"line":530},14,[74,532,413],{"class":360},[74,534,416],{"class":364},[74,536,99],{"class":368},[74,538,421],{"class":364},[74,540,424],{"class":80},[74,542,543],{"class":397},"subtract",[74,545,430],{"class":80},[74,547,103],{"class":102},[74,549,550],{"class":106},"1.7",[74,552,103],{"class":102},[74,554,440],{"class":80},[74,556,371],{"class":102},[74,558,559],{"class":106},"1.6",[74,561,103],{"class":102},[74,563,450],{"class":80},[74,565,567,569,571,573,575,577,579,581],{"class":76,"line":566},15,[74,568,456],{"class":364},[74,570,424],{"class":80},[74,572,461],{"class":397},[74,574,430],{"class":80},[74,576,466],{"class":364},[74,578,440],{"class":80},[74,580,471],{"class":364},[74,582,450],{"class":80},[74,584,586,588,590,592,594,596,599,601,603,605],{"class":76,"line":585},16,[74,587,479],{"class":364},[74,589,424],{"class":80},[74,591,484],{"class":397},[74,593,430],{"class":80},[74,595,103],{"class":102},[74,597,598],{"class":106},"0.1",[74,600,103],{"class":102},[74,602,440],{"class":80},[74,604,471],{"class":364},[74,606,450],{"class":80},[74,608,610],{"class":76,"line":609},17,[74,611,505],{"class":80},[74,613,615],{"class":76,"line":614},18,[74,616,617],{"class":80},"}\n",[27,619,620],{},"Assert 是 junit 里的一个类，比如我使用的是 assertEquals 方法，如果两个参数的值相等，则运行时不会报错，如果值不等，则会报错。",[27,622,623],{},"编写好测试类之后，右击，运行方式里选择 Android JUnit Test，然后等待即可。",[27,625,626],{},"测试成功的截图：",[628,629],"post-image",{"filename":630},"01.png",[27,632,633],{},"如果我们把 testMinus()中的 Assert.assertEquals(“0.1″, answer)改成 Assert.assertEquals(“0.2″, answer)，再运行的话，就会出现：",[628,635],{"filename":636},"02.png",[27,638,639],{},"可以在故障跟踪里看到到底哪里出了问题。",[27,641,642],{},"好了，简单的 Android 单元测试就介绍到这里，以后可以很轻松地对某个类进行测试了，而不需要运行整个项目。",[644,645,646],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_bVq, html code.shiki .s_bVq{--shiki-light:#9C3EDA;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":70,"searchDepth":132,"depth":132,"links":648},[],null,"2012-07-31",false,"md","成都",{},"\u002Fposts\u002F2012\u002Fandroid-unit-test",{"text":657,"minutes":658,"time":659,"words":660},"4 min read",3.25,195000,650,{"title":22,"description":29},{"loc":655},"posts\u002F2012\u002F20120731.android-unit-test",[665,666],"技术","Android","中午","-EQ96eMLk-j-puq0a9ftLoOxuMvfOt9YYAQkFoYxj1g",[670,676],{"title":671,"path":672,"stem":673,"date":674,"description":675,"children":-1},"近期开发小结","\u002Fposts\u002F2012\u002Fbrief-summary","posts\u002F2012\u002F20120824.brief-summary","2012-08-24","很久没有写博客了，主要是这些天在忙着开发校友录的网站，从 php、js 的门外汉，逐渐跨进了门儿，虽然开始的框架、布局、样式都是在模仿，布局大多是模仿的 github 的网站，因为我发现它的个人资料修改的界面很合我意，简单清爽而且不老土，于是花了一两天才把网站的基本框架界面搭好了，要知道，我对 CSS 以前几乎是一窍不通的，哈哈，还是很有成就感的。由于有 java 的基础，在接触 js 的时候也就没什么困难了，也只有 ajax 操作那块有个异步操作让我费了不少心，显示的提示图片总是不正确，后来就没有用异步，直接等完成之后再继续下面的代码。",{"title":677,"path":678,"stem":679,"date":680,"description":681,"children":-1},"C# 获取指定网卡的 IP 地址","\u002Fposts\u002F2012\u002Fcsharp-get-ipaddress","posts\u002F2012\u002F20120728.csharp-get-ipaddress","2012-07-28","最近几天都在玩游戏，没怎么编程，感觉好空虚啊！主要是之前在 Android 上建立 wifi 热点出现了一些问题，难以进展下去，于是便耽搁了，今天决定先跳过那个问题，Android 手机之间的传输先暂时不考虑，先做一下 Android 与 PC 之间的数据传输。",1777580290421]