走进TDD(二):工具箱
昨天写了从书上抄过来的关于TDD的理论,自己也颇有收获,但纸上得来终觉浅,觉知此事要躬行。很多人觉得不就JUnit吗?哦……也对,甚至不用JUnit都行,但在现在社会,不使用点框架自己都觉得土,况且使用这些工具的确能带来便捷。 一、TestNG TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit的,但引入了一些新的功能,使其功能更强大,使用更方便。NG表示下一代。 TestNG类似于JUnit(特别是JUnit 4),但它不是一个JUnit扩展。它优于JUnit,尤其是当测试集成的类。 TestNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解(JDK5.0引入的)来定义的测试。 TestNG有以下特点:
TestNG支持命令行、ant、maven等方式调用。主流的IDE都提供了相应的插件,使用起来很方便。 编写TestNG测试基本上包括以下步骤: 编写业务逻辑测试代码,在代码中插入TestNG的注解。 添加一个testng.xml文件,这个文件是TestNG独有的,它用来灵活定制测试信息。如要测试的类,方法等。这个文件也可以没有。 运行 TestNG。 1.TestNG注解: @BeforeClass:被注解的方法将在当前类的第一个测试方法被调用前运行. @AfterClass:被注解的方法将在当前类的所有测试方法运行后运行。 @BeforeMethod:被注解的方法将在每个测试方法运行前运行. @AfterMethod:被注解的方法将在每个测试方法运行后运行. @Test:标识一个类或方法作为测试的一部分.有如下常用属性: groups:本类或方法所属的组列表。如@Test(groups = {“integrate”,“refund”})。该属性可以加在类或方法上。如果类和方法上都有,则方法上的组是类上的组的扩展。 timeOut:本测试应该执行的最大时间,单位为毫秒。 dependsOnMethods:依赖于其他操作的执行。 结果验证 静态导入import static org.testng.Assert.*;使用其assert*()方法。如:assertTrue(),assertNotNull(),assertEquals() 来看下面这个简单的例子: publicclassTest1{ @Test publicvoidtestMethod1(){ } @Test publicvoidtestMethod2(){ } @Test publicvoidtestMethod3(){ } } 2.强大的分组功能 TestNG容许执行复杂的测试分组方法。不仅可以申明方法属于组,而且可以指定分组包含其他分组。然后TestNG可以被调用,并被要求包含某些分组和排除其他的分组。这将提供怎样划分测试的最大弹性,并且如果想运行两个不同的测试装置不需要重新编译。 例如,非常普遍的需要至少两个种类的测试 * 单元测试.这些测试只用来检查单个类的功能,特点是执行速度快。 * 集成测试.这些测试用来检查多个模块合作完一个功能是否正确,特点是连接模块较多,执行速度会比较慢。 TestNG可以用非常直接的方式说明这个。例如:可以这样构造测试,定义”unitTest”和”integrateTest"两个测试组,申明testMethod2属于”unitTest”组,testMethod3属于”integrateTest”组,testMethod1同时属于”unitTest”组和”integrateTest”组: publicclassTest1{ @Test(groups={"unitTest","integrateTest"}) publicvoidtestMethod1(){ } @Test(groups={"unitTest"}) publicvoidtestMethod2(){ } @Test(groups={"integrateTest"}) publicvoidtestMethod3(){ } } 3.testng.xml文件使用 testing.xml用来指定测试的配置参数。当然,不需要testing.xml也可以执行单元测试。下面是testng.xml文件的一个例子,通过这个例子你可以看到TestNG的强大之处,它指定了测试时执行integrateTest测试组的所有测试,不执行unitTest组的测试代码,并执行test.IndividualMethodsTest类的testMethod测试方法。 <!DOCTYPEsuiteSYSTEM"http://testng.org/testng-1.0.dtd"> <suitename="Suite1"verbose="1"> <testname="Regression1"> <groups> <run> <excludename="unitTest"/> <includename="integrateTest"/> </run> </groups> <classes> <classname="test.IndividualMethodsTest"> <methods> <includename="testMethod"/> </methods> </class> </classes> </test> </suite> 还可以在testng.xml中定义新的组,指定属性的额外详细情况,比如是否并行运行测试,等等... 4.参数化测试 在写测试代码时你可以使用Data Provider来提供你测试需要的数值。Data Provider是类中的一个返回对象数组的数组的方法。这个方法带有@DataProvider注解: //这个方法将提供数据给任何声明它的DataProvider名为"test1"的测试方法 @DataProvider(name="test1") publicObject[][]createData1(){ returnnewObject[][]{ {"Cedric",newInteger(36)},{"Anne",newInteger(37)},}; } //这个方法声明它的数据将由名为"test1"的DataProvider提供 @Test(dataProvider="test1") publicvoidverifyData1(Stringn1,Integern2){ System.out.println(n1+""+n2); } 将打印 Cedric36 Anne37 @Test方法用dataProvider属性来指定它的Data Provider。这个名字必须符合同一个类中用@DataProvider(name="...")注解的方法,它们要使用同一个匹配的名字。 二、Maven 为什么要用Maven,它可不是一个测试框架啊? 1.Maven的生命周期阶段是compile-test-package-deploy。已经整合了测试阶段,在打包布署前就会执行测试,当然我们也可以显示告诉Maven跳过测试阶段。 2.标准的Maven目录是这样:
它已经为测试代码准备了安放的目录,在执行打包布署的时候也不会把测试代码发布,避免了测试混入业务代码上线的郁闷。一般会把测试类和业务类使用相同的包名,这样可以方便测试业务类里的包访问权限的属性和方法。目录不一样,不会带到线上的,放心吧。 3.Maven与testng结合使用很方便,只需两步: (1)在pom中加入testng依赖。 <dependencies> [...] <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8.8</version> <scope>test</scope> </dependency> [...] </dependencies> (2)在pom中对testng设置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <suiteXmlFiles><suiteXmlFile>src/test/testng.xml</suiteXmlFile></suiteXmlFiles> </configuration> </plugin> 看到了吧,我们把testng.xml放到了src/test目录下 4.使用maven测试避免了IDE测试的隐藏问题。如测试前方法未编译,配置文件没有拷贝到指定目录等问题使用Maven都不会遇到。 可以让maven跳过测试.加-DskipTests 或-Dmaven.test.skip=true或在pom中设置: <configuration><skipTests>true</skipTests></configuration> 说了这么多Maven和TestNG结合的优势,下面说说怎么执行吧,打开命令行,轻敲下面命令,等待结果即可。当然,前提是设置了JDK和Maven。 mvntest 如果想跳过测试来发布项目,这么做: mvntest-Dmaven.test.skip 什么?在命令行看测试结果太麻烦?有办法! 测试完成后可以在 项目根目录/target/surefire-reports/目录下以html方式查看本测试执行的详细情况。如测试方法列表。方法执行的时间,异常错误的详细信息。 如果你是项目经理或者想给你的小弟找茬,这一招必学: 执行 mvncobertura:cobertura 提示执行成功后在 项目根目录/target/site/cobertura/目录下以html方式查看详细的测试覆盖率报告。 测试覆盖率这么低?加班! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |