走进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()

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

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测试方法。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
  <test name="Regression1">
  <groups>
    <run>
      <exclude name="unitTest"  />
      <include name="integrateTest"  />
    </run>
  </groups>
  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod" />
      </methods>
    </class>
  </classes>
</test>
</suite>

还可以在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 36
Anne 37

@Test方法用dataProvider属性来指定它的Data Provider。这个名字必须符合同一个类中用@DataProvider(name="...")注解的方法,它们要使用同一个匹配的名字。

二、Maven

为什么要用Maven,它可不是一个测试框架啊?

1.Maven的生命周期阶段是compile-test-package-deploy。已经整合了测试阶段,在打包布署前就会执行测试,当然我们也可以显示告诉Maven跳过测试阶段。

2.标准的Maven目录是这样:

走进TDD(二):工具箱_第1张图片

它已经为测试代码准备了安放的目录,在执行打包布署的时候也不会把测试代码发布,避免了测试混入业务代码上线的郁闷。一般会把测试类和业务类使用相同的包名,这样可以方便测试业务类里的包访问权限的属性和方法。目录不一样,不会带到线上的,放心吧。

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。

mvn test

如果想跳过测试来发布项目,这么做:

mvn test -Dmaven.test.skip

什么?在命令行看测试结果太麻烦?有办法!

测试完成后可以在 项目根目录/target/surefire-reports/目录下以html方式查看本测试执行的详细情况。如测试方法列表。方法执行的时间,异常错误的详细信息。


如果你是项目经理或者想给你的小弟找茬,这一招必学:

执行

mvn cobertura:cobertura

提示执行成功后在 项目根目录/target/site/cobertura/目录下以html方式查看详细的测试覆盖率报告。

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



你可能感兴趣的:(走进TDD(二):工具箱)