您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
JUnit单元测试框架的使用
作者:java_阿杰 发布时间:[ 2016/10/9 14:04:50 ] 推荐标签:单元测试 Junit

  如果一个方法被 @Before 修饰过了,那么在每个测试方法调用之前,这个方法都会得到调用。所以上面的例子中, testAdd() 被运行之前, setup() 会被调用一次,把 mCalculator 实例化,接着运行 testAdd() ; testMultiply() 被运行之前, setup() 又会被调用一次,把 mCalculator 再次实例化,接着运行 testMultiply() 。如果还有其他的测试方法,则以此类推。
  对应于 @Before 的,有一个 @After ,作用估计你也猜得到,那是每个测试方法运行结束之后,会得到运行的方法。比如一个测试文件操作的类,那么在它的测试类中,可能 @Before 里面需要去打开一个文件,而每个测试方法运行结束之后,都需要去close这个文件。这个时候可以把文件close的操作放在 @After 里面,让它自动去执行。
  类似的,还有 @BeforeClass 和 @AfterClass 。 @BeforeClass 的作用是,在跑一个测试类的所有测试方法之前,会执行一次被 @BeforeClass 修饰的方法,执行完所有测试方法之后,会执行一遍被 @AfterClass 修饰的方法。这两个方法可以用来setup和release一些公共的资源,需要注意的是,被这两个annotation修饰的方法必须是静态的。
  前面讲的是单元测试框架对于一个测试方法的第一步“setup”,为我们做的事情。而对于第三部“验证结果”,则一般是通过一些assert方法来完成的。JUnit为我们提供的assert方法,多数都在 Assert 这个类里面。常用的那些如下:
  assertEquals(expected, actual)
  验证expected的值跟actual是一样的,如果是一样的话,测试通过,不然的话,测试失败。如果传入的是object,那么这里的对比用的是equals()
  assertEquals(expected, actual, tolerance)
  这里传入的expected和actual是float或double类型的,大家知道计算机表示浮点型数据都有一定的偏差,所以哪怕理论上他们是相等的,但是用计算机表示出来则可能不是,所以这里运行传入一个偏差值。如果两个数的差异在这个偏差值之内,则测试通过,否者测试失败。
  assertTrue(boolean condition)
  验证contidion的值是true
  assertFalse(boolean condition)
  验证contidion的值是false
  assertNull(Object obj)
  验证obj的值是null
  assertNotNull(Object obj)
  验证obj的值不是null
  assertSame(expected, actual)
  验证expected和actual是同一个对象,即指向同一个对象
  assertNotSame(expected, actual)
  验证expected和actual不是同一个对象,即指向不同的对象
  fail()
  让测试方法失败
  注意:上面的每一个方法,都有一个重载的方法,可以在前面加一个String类型的参数,表示如果验证失败的话,将用这个字符串作为失败的结果报告。
  比如:
  assertEquals("Current user Id should be 1", 1, currentUser.id());
  当 currentUser.id() 的值不是1的时候,在结果报道里面将显示"Current user Id should be 1",这样可以让测试结果更具有可读性,更清楚错误的原因是什么。
  比较有意思的是后一个方法, fail() ,你或许会好奇,这个有什么用呢?其实这个在很多情况下还是有用的,比如明显的一个作用是,你可以验证你的测试代码真的是跑了的。
  此外,它还有另外一个重要作用,那是验证某个被测试的方法会正确的抛出异常,不过这点可以通过下面讲到的方法,更方便的做到,所以不讲了。
  这部分相对来说还是很好理解的,不做过多解释。
  JUnit的其他功能
  Ignore一些测试方法
  很多时候,因为某些原因(比如正式代码还没有实现等),我们可能想让JUnit忽略某些方法,让它在跑所有测试方法的时候不要跑这个测试方法。要达到这个目的也很简单,只需要在要被忽略的测试方法前面加上 @Ignore 可以了,如下:
  public class CalculatorTest {
  Calculator mCalculator;
  @Before
  public void setup() {
  mCalculator = new Calculator();
  }
  // Omit testAdd() and testMultiply() for brevity
  @Test
  @Ignore("not implemented yet")
  public void testFactorial() {
  }
  }
  验证方法会抛出某些异常
  有的时候,抛出异常是一个方法正确工作的一部分。比如一个除法函数,当除数是0的时候,它应该抛出异常,告诉外界,传入的被除数是0,示例代码如下:
  public class Calculator {
  // Omit testAdd() and testMultiply() for brevity
  public double divide(double divident, double dividor) {
  if (dividor == 0) throw new IllegalArgumentException("Dividor cannot be 0");
  return divident / dividor;
  }}
  那么如何测试当传入的除数是0的时候,这个方法应该抛出 IllegalArgumentException 异常呢?
  在Junit中,可以通过给 @Test annotation传入一个expected参数来达到这个目的,如下:
  public class CalculatorTest {
  Calculator mCalculator;
  @Before
  public void setup() {
  mCalculator = new Calculator();
  }
  // Omit testAdd() and testMultiply() for brevity
  @Test(expected = IllegalArgumentException.class)
  public void test() {
  mCalculator.divide(4, 0);
  }
  }
  @Test(expected = IllegalArgumentException.class) 表示验证这个测试方法将抛出 IllegalArgumentException 异常,如果没有抛出的话,则测试失败。
  小结
  这篇文字大概简单介绍了JUnit的使用,相对来说是比较简单,也是比较容易理解的,希望能帮助到大家。其中Assert部分,可以帮我们验证一个方法的返回结果。然而,这些只能帮我们测试有返回值的那些方法。在第一篇文章里面我们讲了,一个类的方法分两种,一是有返回值的方法,这些可以通过我们讲的JUnit来做测试。而另外一种没有返回值的方法,即void方法,则要通过另外一个框架,Mockito,来验证它的正确性。

上一页12下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd