走进TDD(二):工具箱

前端之家收集整理的这篇文章主要介绍了走进TDD(二):工具箱前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

昨天写了从书上抄过来的关于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()

来看下面这个简单的例子:

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方式查看详细的测试覆盖率报告。

测试覆盖率这么低?加班!

猜你在找的设计模式相关文章