博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
走进TDD(二):工具箱
阅读量:5764 次
发布时间:2019-06-18

本文共 4342 字,大约阅读时间需要 14 分钟。

hot3.png

昨天写了从书上抄过来的关于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目录是这样:

234501_094T_112325.png

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

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

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

转载于:https://my.oschina.net/wuxianAbs/blog/282980

你可能感兴趣的文章
轻量级的Java 开发框架 Spring
查看>>
JS之路——浏览器window对象
查看>>
Chrome教程(二)使用ChromeDevTools命令菜单运行命令
查看>>
数据结构及算法基础--快速排序(Quick Sort)(二)优化问题
查看>>
随笔2013/2/19
查看>>
Windows Phone的Silverlight Toolkit 安装及其使用
查看>>
DBS:同学录
查看>>
Mysql备份系列(1)--备份方案总结性梳理
查看>>
[CareerCup] 1.6 Rotate Image 翻转图像
查看>>
Python中的画图初体验
查看>>
Java程序员的日常 —— 响应式导航Demo
查看>>
objective-c内存管理基础
查看>>
sap关于价值串的说法(转载)
查看>>
Migration to S/4HANA
查看>>
sed 对目录进行操作
查看>>
什么是代码
查看>>
移动端开发单位——rem,动态使用
查看>>
系列文章目录
查看>>
手把手教你如何提高神经网络的性能
查看>>
前端布局原理涉及到的相关概念总结
查看>>