gradle复习(3)-在gradle项目中使用TestNG

最后更新于:2022-04-01 06:52:13

## 1.gradle项目 在eclipse中创建的java项目,用gradle管理。我要复习的是关于在gradle中使用TestNG的知识。首先TestNG环境配置如[上一篇文章](http://blog.csdn.net/itfootball/article/details/42918445)。 测试目录下有2个java文件。一个是PersonTest.java,一个是SimpleTest。 PersonTest.java:用junit写的测试类。 SimpleTest:TestNG写的测试类。 ~~~ public class PersonTest { @Test public void canConstructAPersonWithAName() { Person person = new Person("Larry"); assertEquals("Larry", person.getName()); } } ~~~ ~~~ public class SimpleTest { @BeforeClass public void setUp() { System.out.println("setUp"); } @Test(groups = { "slow" }) public void aSlowTest() { System.out.println("slow test"); } @Test(groups = { "fast" }) public void aFastTest() { System.out.println("fast test"); } } ~~~ build.gradle原始脚本如下: build.gradle ~~~ apply plugin: 'java' apply plugin: 'eclipse' sourceCompatibility = 1.7 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } } repositories { mavenCentral() } dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' compile 'org.testng:testng:6.8.17' testCompile group: 'junit', name: 'junit', version: '4.+' } task copyJars(type:Copy){ from configurations.runtime into 'libs' } uploadArchives { repositories { flatDir { dirs 'repos' } } } ~~~ 这个时候执行命令,你会发现默认会执行JUnit的case。 ~~~ D:\eclipse\workspare\TestNG_gradl>gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses :test :check :build BUILD SUCCESSFUL Total time: 5.179 secs ~~~ 报告如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466ad9476.jpg) 那么我要如何选择TestNG的呢? ## 2.执行TestNG测试 很简单,在build.gradle添加如下语句 ~~~ test { useTestNG() } ~~~ 先执行clean任务清空之前的build文件。重新build: ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean :clean BUILD SUCCESSFUL Total time: 4.355 secs D:\eclipse\workspare\TestNG_gradl>gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses :test :check :build BUILD SUCCESSFUL Total time: 5.319 secs ~~~ 你会发现,执行的case就是TestNG的case啦。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466aedfce.jpg) 就是这么简单。 ## 3.TestNG配置 ### 报告配置 默认情况下报告中html文件是存在的,我们可以选择不生成html文件。 build.gradle: ~~~ test { useTestNG() reports.html.enabled = false } ~~~ 这个时候重新构建的话就不再生成reports文件了。 如果我们想将报告copy到其他路径。注意这里是copy不是重定向。 ~~~ task testReport(type:TestReport){ destinationDir = file("D:/gradle_product/0120") reportOn test } ~~~ 这个时候clean在执行testReport: ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean testReport :clean :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :test :testReport BUILD SUCCESSFUL Total time: 5.447 secs ~~~ 这个时候你会在相应目录下找到报告相关的文件。 ## 分组测试 选择某一个组的case进行测试 build.gradle: ~~~ test { useTestNG{ includeGroups 'slow' } //reports.html.enabled = false } ~~~ 我们选择测试slow分组的case。重新构建查看报告如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b07c26.jpg) 发现就执行了一条case,点进去 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b1a3a9.jpg) 分组配置成功。 ## 分class文件测试 我们上面是根据TestNG中分组来进行测试的,也有按照一个测试类文件进行测试,比如我们就像测试一个java文件里的测试项。为了区分,我们添加了一个SimpleTest1.java的TestNG的case类。 ~~~ public class SimpleTest1 { @BeforeClass public void setUp() { System.out.println("setUp"); } @Test(groups = { "slow" }) public void aSlowTest1() { System.out.println("slow test1"); } @Test(groups = { "fast" }) public void aFastTest1() { System.out.println("fast test1"); } } ~~~ 这个时候我们如果想测SimpleTest1有两种方法。 1.include包含被测类文件 build.gradle: ~~~ test { useTestNG() systemProperty 'some.prop', 'value' include 'org/gradle/SimpleTest1.class' } ~~~ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b28bc0.jpg) 2.由于我们这里面只有2个文件,这样我们通过剔除SimpleTest类来达到测试SimpleTest1类的效果。 测试的结果是和上面的结果一样的,就不再贴图了。 ## 两种过滤条件的结合 现在我们将分组条件和分class文件这两个条件一起使用,看看效果。 上面我们只测试了SimpleTest1.class中的全部方法,这个时候我们用分组来过滤一下,只测试SimpleTest1.class里的slow分组的方法。 build.gradle: ~~~ test { useTestNG{ includeGroups 'slow' } systemProperty 'some.prop', 'value' exclude 'org/gradle/SimpleTest.class' } ~~~ 这个时候我们重新构建,执行后你会发现只测试了aSlowTest1方法。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b37edd.jpg) 当然过滤分组还可以通过excludeGroups ‘fast’和上面的效果是一样的,就不再举例了。 下面要尝试的是,当这两个条件组合在一起的时候没找到要测试的case会发生什么? 刚才我们测试了SimpleTest1.class中的slow分组的case,现在把添加改成slow1,因为slow1是没有的,所以应该不会在SimpleTest1.class找到相应的case,看这次的构建结果是啥样的。 build.gradle ~~~ test { useTestNG{ includeGroups 'slow1' } systemProperty 'some.prop', 'value' exclude 'org/gradle/SimpleTest.class' } ~~~ 结果文件如下,结果文件是有的,但是可以看到结果文件没有case的相关信息,说明没有执行任何case。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b4fa87.jpg) 3.利用testng.xml进行配置 gradle项目中也可以使用testng.xml来进行测试case的配置 我们首先新建一个testng.xml文件: ~~~ <?xml version="1.0" encoding="UTF-8"?> <suite name="doctorng"> <!--enabled="true"让测试生效,可根据情况开启或关闭某些测试--> <test name="test" enabled="true"> <!--指定参数--> <parameter name="accesskey" value="f0af8e412cef7e5058beeb6df2012e1e"/> <!--指定测试包,注意加 .* --> <packages> <package name="org.gradle.*"/> </packages> <!--指定测试类--> <classes> <class name="org.gradle.SimpleTest"/> <!--过滤测试类的方法--> <class name="org.gradle.SimpleTest1"> <methods> <include name="aFastTest" /> </methods> </class> </classes> <!--指定测试分组--> <groups> <run> <!--包含--> <include name="fast"/> <!--排除--> <exclude name="slow"/> </run> </groups> </test> </suite> ~~~ 然后在build.gradle中获得该文件中的内容: ~~~ test { useTestNG{ suites(file('src/test/resources/org/gradle/testng.xml')); } beforeTest { descriptor -> logger.lifecycle("Running test: " + descriptor) } onOutput { descriptor, event -> logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message ) } } ~~~ 重点就是useTestNG里的闭包代码,这就把testng.xml包含进来了。 ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean test :clean :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :test Running test: test method aFastTest(org.gradle.SimpleTest) Test: test method aFastTest(org.gradle.SimpleTest) produced standard out/err: fa st test Running test: test method aFastTest1(org.gradle.SimpleTest) Test: test method aFastTest1(org.gradle.SimpleTest) produced standard out/err: f ast test1 Running test: test method aFastTest2(org.gradle.SimpleTest) Test: test method aFastTest2(org.gradle.SimpleTest) produced standard out/err: f ast test2 Running test: test method aFastTest3(org.gradle.SimpleTest) Test: test method aFastTest3(org.gradle.SimpleTest) produced standard out/err: f ast test3 Running test: test method aFastTest1(org.gradle.SimpleTest1) Test: test method aFastTest1(org.gradle.SimpleTest1) produced standard out/err: fast test1 BUILD SUCCESSFUL Total time: 5.741 secs D:\eclipse\workspare\TestNG_gradl> ~~~ 测试报告如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466b61549.jpg)
';