android 单元测试

阅读:416 2019-03-19 14:43:05 来源:新网

github下载测试源码

在这个codelab中,你将学习如何在androidstudio中配置工程用于测试,在开发机器上编写并运行单元测试,以及如何在手机上做功能ui测试。

你会学到什么

你需要什么

如果是第一次启动androidstudio,从欢迎页选择“startanewandroidstudioproject”。如果已经打开了一个工程,选择file>new>newproject...

“createnewproject”向导会指导整个过程,在第一页输入如下内容:

这样会保证你的代码同codelab讲解的内容具有一致的命名。其他的选项都设置为默认,一路点击next直到工程创建完毕。

点击run按钮检查app是否运行正常,要么从模拟器列表中选择一个启动,要么确认开启了debug模式的设备通过usb同电脑正确连接。

app目前没有做任何事情,但是屏幕上应该显示“helloworld!”和app的名字。

经常被问及的问题

在写测试之前,让我们做下简单的检查,确保工程配置正确。

首先,确认在buildvariants窗口内的testartifact中选择了"unittests"。

然后,在工程的src文件夹内创建test和test/java文件夹。需要注意的是,你不能在android视图下进行这些操作,要么在系统的文件管理器内创建,要么在工程窗口左上方点击下拉菜单选择project视图。最终的工程结构应该是这样的:

(在codelab的剩余部分,你可以返回继续使用android工程视图)

最后,打开工程的build.gradle(module:app)文件,添加junit4依赖,点击gradlesync按钮。

build.gradle

dependencies{compilefiletree(dir:'libs',include:['*.jar'])compile'com.android.support:appcompat-v7:22.1.1'testcompile'junit:junit:4.12'}

当你同步gradle配置时,可能需要联网下载junit依赖。

现在,万事俱备,让我们开始写第一个测试吧。首先,创建一个非常简单的被测类:calculator类。

然后,向类中添加一些基本的算术运算方法,比如加法和减法。将下列代码复制到编辑器中。不用担心实际的实现,暂时让所有的方法返回0。

calculator.java

packagecom.example.testing.testingexample;publicclasscalculator{publicdoublesum(doublea,doubleb){return0;}publicdoublesubstract(doublea,doubleb){return0;}publicdoubledivide(doublea,doubleb){return0;}publicdoublemultiply(doublea,doubleb){return0;}}

androidstudio提供了一个快速创建测试类的方法。只需在编辑器内右键点击calculator类的声明,选择goto>test,然后"createanewtest…"

在打开的对话窗口中,选择junit4和"setup/@before",同时为所有的计算器运算生成测试方法。

这样,就会在正确的文件夹内(app/src/test/java/com/example/testing/testingexample)生成测试类框架,在框架内填入测试方法即可。下面是一个示例:

calculator.java

packagecom.example.testing.testingexample;importorg.junit.before;importorg.junit.test;importstaticorg.junit.assert.*;publicclasscalculatortest{privatecalculatormcalculator;@beforepublicvoidsetup()throwsexception{mcalculator=newcalculator();}@testpublicvoidtestsum()throwsexception{//expected:6,sumof1and5assertequals(6d,mcalculator.sum(1d,5d),0);}@testpublicvoidtestsubstract()throwsexception{assertequals(1d,mcalculator.substract(5d,4d),0);}@testpublicvoidtestdivide()throwsexception{assertequals(4d,mcalculator.divide(20d,5d),0);}@testpublicvoidtestmultiply()throwsexception{assertequals(10d,mcalculator.multiply(2d,5d),0);}}

请将代码复制到编辑器或者使用junit框架提供的断言来编写自己的测试。

终于到运行测试的时候了!右键点击calculatortest类,选择run>calculatortest。也可以通过命令行运行测试,在工程目录内输入:

./gradlewtest

无论如何运行测试,都应该看到输出显示4个测试都失败了。这是预期的结果,因为我们还没有实现运算操作。

让我们修改calculator类中的sum(doublea,doubleb)方法返回一个正确的结果,重新运行测试。你应该看到4个测试中的3个失败了。

calculator.java

publicdoublesum(doublea,doubleb){returna+b;}

作为练习,你可以实现剩余的方法使所有的测试通过。

可能你已经注意到了androidstudio从来没有让你连接设备或者启动模拟器来运行测试。那是因为,位于src/tests目录下的测试是运行在本地电脑java虚拟机上的单元测试。编写测试,实现功能使测试通过,然后再添加更多的测试...这种工作方式使快速迭代成为可能,我们称之为测试驱动开发。值得注意的是,当在本地运行测试时,gradle为你在环境变量中提供了包含android框架的android.jar包。但是它们功能不完整(所以,打个比方,你不能单纯调用activity的方法并指望它们生效)。推荐使用mockito等mocking框架来mock你需要使用的任何android方法。对于运行在设备上,并充分利用android框架的测试,请继续阅读本篇教程的下个部分。

虽然在android框架内支持运行instrumentation测试,但是目前开发重心主要集中在刚刚发布的作为androidtestingsupportlibrary一部分的新的androidjunitrunner。测试库包含espresso,用于运行功能ui测试的框架。让我们通过编辑build.gradle的相关部分来把它们添加进我们的工程。

build.gradle

applyplugin:'com.android.application'android{compilesdkversion22buildtoolsversion"22.0.1"defaultconfig{applicationid"com.example.testing.testingexample"minsdkversion15targetsdkversion22versioncode1versionname"1.0"//addthisline:testinstrumentationrunner"android.support.test.runner.androidjunitrunner"}buildtypes{release{minifyenabledfalseproguardfilesgetdefaultproguardfile('proguard-android.txt'),'proguard-rules.pro'}}//addtheselines:packagingoptions{exclude'license.txt'}}dependencies{compilefiletree(dir:'libs',include:['*.jar'])compile'com.android.support:appcompat-v7:22.0.0'//←makesureit’s22.0.0testcompile'junit:junit:4.12'//addtheselines:androidtestcompile'com.android.support.test:runner:0.2'androidtestcompile'com.android.support.test:rules:0.2'androidtestcompile'com.android.support.test.espresso:espresso-core:2.1'}

重要:由于一些依赖版本冲突,你需要确认com.android.support:appcompat-v7库的版本号是22.0.0,像上面的代码片段一样。另外,androidstudio可能会提醒你buildtools22.0.1没有安装。你应该接受修复建议,studio会为你安装buildtools或者在build.gradle中把这行修改成已经安装在你电脑的版本。

上面的工作完成后,在buildvariants窗口内切换成androidinstrumentationtests,你的工程应该自动同步。如果没有,点击gradlesync按钮。

在使用espresso进行ui测试前,让我们为app添加一些views和简单的交互。我们使用一个用户可以输入名字的edittext,欢迎用户的button和用于输出的textview。打开res/layout/activity_main.xml,粘贴如下代码:activity_main.xml

还需要在mainactivity.java中添加onclickhandler:

mainactivity.java

publicvoidsayhello(viewv){textviewtextview=(textview)findviewbyid(r.id.textview);edittextedittext=(edittext)findviewbyid(r.id.edittext);textview.settext("hello,"+edittext.gettext().tostring()+"!");}

现在可以运行app并确认一切工作正常。在点击run按钮之前,确认你的runconfiguration没有设置为运行测试。如需更改,点击下拉选项,选择app。

在工程的整体视图上,找到以(androidtest)后缀结尾的包名并创建一个新的java类。可以将它命名为mainactivityinstrumentationtest,将如下代码粘贴过去。

**mainactivityinstrumentationtest.java

packagecom.example.testing.testingexample;importandroid.support.test.instrumentationregistry;importandroid.support.test.espresso.action.viewactions;importandroid.support.test.rule.activitytestrule;importandroid.support.test.runner.androidjunit4;importandroid.test.activityinstrumentationtestcase2;importandroid.test.suitebuilder.annotation.largetest;importorg.junit.after;importorg.junit.before;importorg.junit.rule;importorg.junit.test;importorg.junit.runner.runwith;importstaticandroid.support.test.espresso.espresso.onview;importstaticandroid.support.test.espresso.action.viewactions.click;importstaticandroid.support.test.espresso.action.viewactions.closesoftkeyboard;importstaticandroid.support.test.espresso.action.viewactions.typetext;importstaticandroid.support.test.espresso.assertion.viewassertions.matches;importstaticandroid.support.test.espresso.matcher.viewmatchers.withid;importstaticandroid.support.test.espresso.matcher.viewmatchers.withtext;@runwith(androidjunit4.class)@largetestpublicclassmainactivityinstrumentationtest{privatestaticfinalstringstring_to_be_typed="peter";@rulepublicactivitytestrulemactivityrule=newactivitytestrule<>(mainactivity.class);@testpublicvoidsayhello(){onview(withid(r.id.edittext)).perform(typetext(string_to_be_typed),closesoftkeyboard());//line1onview(withtext("sayhello!")).perform(click());//line2stringexpectedtext="hello,"+string_to_be_typed+"!";onview(withid(r.id.textview)).check(matches(withtext(expectedtext)));//line3}}

测试类通过androidjunitrunner运行,并执行sayhello()方法。下面将逐行解释都做了什么:

你也可以右键点击域名运行测试,选择run>mainactivityinstrume...(第二个带android图标的)

这样就会在模拟器或者连接的设备上运行测试,你可以在手机屏幕上看到被执行的动作(比如在edittext上打字)。最后会在androidstudio输出通过和失败的测试结果。

github下载测试源码

我们希望你能喜欢本篇教程,并且开始着手测试你的应用程序。接着你可以学习如下内容:

观看下面非常棒的有关androidstudio的视频:

(完)

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服