昨天写了从书上抄过来的关于TDD的理论,自己也颇有收获,但纸上得来终觉浅,觉知此事要躬行。很多人觉得不就JUnit吗?哦……也对,甚至不用JUnit都行,但在现在社会,不使用点框架自己都觉得土,况且使用这些工具的确能带来便捷。
一、TestNG
TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit的,但引入了一些新的功能,使其功能更强大,使用更方便。NG表示下一代。 TestNG类似于JUnit(特别是JUnit 4),但它不是一个JUnit扩展。它优于JUnit,尤其是当测试集成的类。 TestNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解(JDK5.0引入的)来定义的测试。
TestNG有以下特点:
使用注解
TestNG使用Java和面向对象的功能
支持综合类测试(例如,默认情况下,没有必要创建一个新的测试每个测试方法的类的实例)
独立的编译时间测试代码运行时配置/数据信息
灵活的运行时配置
支持“测试组”。当编译测试,只要问TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
支持依赖测试方法,并行测试,负载测试,局部故障
灵活的插件API
支持多线程测试
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()
来看下面这个简单的例子:
public class Test1 { @Test public void testMethod1() { } @Test public void testMethod2() { } @Test public void testMethod3() { }}
2.强大的分组功能
TestNG容许执行复杂的测试分组方法。不仅可以申明方法属于组,而且可以指定分组包含其他分组。然后TestNG可以被调用,并被要求包含某些分组和排除其他的分组。这将提供怎样划分测试的最大弹性,并且如果想运行两个不同的测试装置不需要重新编译。
例如,非常普遍的需要至少两个种类的测试
* 单元测试.这些测试只用来检查单个类的功能,特点是执行速度快。
* 集成测试.这些测试用来检查多个模块合作完一个功能是否正确,特点是连接模块较多,执行速度会比较慢。
TestNG可以用非常直接的方式说明这个。例如:可以这样构造测试,定义”unitTest”和”integrateTest"两个测试组,申明testMethod2属于”unitTest”组,testMethod3属于”integrateTest”组,testMethod1同时属于”unitTest”组和”integrateTest”组:
public class Test1 { @Test(groups = { "unitTest", "integrateTest" }) public void testMethod1() { } @Test(groups = {"unitTest"} ) public void testMethod2() { } @Test(groups = { "integrateTest" }) public void testMethod3() { }}
3.testng.xml文件使用
testing.xml用来指定测试的配置参数。当然,不需要testing.xml也可以执行单元测试。下面是testng.xml文件的一个例子,通过这个例子你可以看到TestNG的强大之处,它指定了测试时执行integrateTest测试组的所有测试,不执行unitTest组的测试代码,并执行test.IndividualMethodsTest类的testMethod测试方法。
还可以在testng.xml中定义新的组,指定属性的额外详细情况,比如是否并行运行测试,等等...
4.参数化测试
在写测试代码时你可以使用Data Provider来提供你测试需要的数值。Data Provider是类中的一个返回对象数组的数组的方法。这个方法带有@DataProvider注解:
//这个方法将提供数据给任何声明它的Data Provider名为"test1"的测试方法@DataProvider(name = "test1")public Object[][] createData1() { return new Object[][] { { "Cedric", new Integer(36) }, { "Anne", new Integer(37)}, };}//这个方法声明它的数据将由名为"test1"的Data Provider提供@Test(dataProvider = "test1")public void verifyData1(String n1, Integer n2) { System.out.println(n1 + " " + n2);}
将打印
Cedric 36Anne 37
@Test方法用dataProvider属性来指定它的Data Provider。这个名字必须符合同一个类中用@DataProvider(name="...")注解的方法,它们要使用同一个匹配的名字。
二、Maven
为什么要用Maven,它可不是一个测试框架啊?
1.Maven的生命周期阶段是compile-test-package-deploy。已经整合了测试阶段,在打包布署前就会执行测试,当然我们也可以显示告诉Maven跳过测试阶段。
2.标准的Maven目录是这样:
它已经为测试代码准备了安放的目录,在执行打包布署的时候也不会把测试代码发布,避免了测试混入业务代码上线的郁闷。一般会把测试类和业务类使用相同的包名,这样可以方便测试业务类里的包访问权限的属性和方法。目录不一样,不会带到线上的,放心吧。
3.Maven与testng结合使用很方便,只需两步:
(1)在pom中加入testng依赖。
[...] [...] org.testng testng 6.8.8 test
(2)在pom中对testng设置:
org.apache.maven.plugins maven-surefire-plugin src/test/testng.xml
看到了吧,我们把testng.xml放到了src/test目录下
4.使用maven测试避免了IDE测试的隐藏问题。如测试前方法未编译,配置文件没有拷贝到指定目录等问题使用Maven都不会遇到。
可以让maven跳过测试.加-DskipTests 或-Dmaven.test.skip=true或在pom中设置:
<configuration><skipTests>true</skipTests></configuration>
说了这么多Maven和TestNG结合的优势,下面说说怎么执行吧,打开命令行,轻敲下面命令,等待结果即可。当然,前提是设置了JDK和Maven。
mvn test
如果想跳过测试来发布项目,这么做:
mvn test -Dmaven.test.skip
什么?在命令行看测试结果太麻烦?有办法!
测试完成后可以在 项目根目录/target/surefire-reports/目录下以html方式查看本测试执行的详细情况。如测试方法列表。方法执行的时间,异常错误的详细信息。
如果你是项目经理或者想给你的小弟找茬,这一招必学:
执行
mvn cobertura:cobertura
提示执行成功后在 项目根目录/target/site/cobertura/目录下以html方式查看详细的测试覆盖率报告。
测试覆盖率这么低?加班!