单元测试之JUnit4

来源:互联网 发布:软件规格型号怎么写 编辑:程序博客网 时间:2024/05/17 05:04


JUnit4 测试框架,是目前应用最为广泛的单元测试框架,也是最为基础的框架。

Android studio 中使用JUnit4 测试类 
在类的代码中,右键go to-》选择Test-》create new test-》 
Class name:一般是自动生成测试名+Test的测试类 
选择要测试的方法,可根据需要,选择setUp/@Before 或者tearDown/After 
测试代码的放置位置一般有3种:

1.相同目录下:

如项目类:com.niepan.modul.exception.main.MainException 
响应的测试类:com.niepan.modul.exception.main.MainExceptionTest 
优点:MainExceptionTest可以访问MainException的成员方法、变量 
缺点:测试代码堆积在生产代码中

2.子目录:

在产品代码目录下创建Test子目录 
如项目类:com.niepan.modul.exception.main.MainException 
响应的测试类:com.niepan.modul.exception.main.Test.MainExceptionTest 
优点:测试代码远离生产代码 
缺点:测试类无法访问产品类中的protected成员

3.并行树:

产品类与测试类都在同一个包中,都在编译器ClassPath中,但是位于不同的源码树如项目类:sf/com.niepan.modul.exception.main.MainException 
响应的测试类:test/com.niepan.modul.exception.main.MainExceptionTest 
优点:测试代码远离生产代码,且相对独立。 
较多采用的也是第3中方法放置测试代码。

在Grandle中声明 mockito 依赖

testCompile 'junit:junit:4.12'


一般,一个测试方法主要包含3个部分: 
1. setUp 
2. 执行操作 
3. 验证结果
每个测试都应该是相互独立的,在任何顺序情况下都能运行单独的测试,JUnit提供了两个方法setUp()、tearDown() 分别用于测试环境的建立和清理。 
每一个方法,都有一个对应的测试方法,测试方法的命名要能体现测试的方法或功能点。测试方法前面的@Test 注解标识被Junit识别为测试方法,其他注解如下:

  1. @BeforeClass: 所有测试开始之前运行,一个类中只出现一次。必须为public static void
    @BeforeClass     
public static void runBeforeClass() {
// 多个用例公用的部分
//如数据库连接、读取文件
}
  1. @AfterClass: 所有测试结束之后运行,一个类只出现一次,必须为public static void。对应BeforeClass。
    @AfterClass     
public static void runAfterClass() {
//
}
  1. @Before: 每一个测试方法之前运行
    @Before
public void setUp() throws Exception{
operation=new Operation();
}
  1. @After : 每一个测试方法之后运行
      @After
public void afterAllTests() throws Exception{
operation=null;
}
  1. @Test : 测试方法,测试程序会运行的方法。

  2. @Ignore : 被忽略的测试方法

    @Ignore("Not Ready to Run" ) 
@Test
public void addTest(){
int real=operation.add(2,3);
Assert.assertEquals(5,real);
}

Junit的最基本的断言、测试异常,捕获异常,测试方法的性能。

断言:

用来帮助我们确定被测试的方法是否按照预期的效果正常工作。 
(1)assertEquals([String message],expected,actual) 
message可选,错误发生时报告消息。 
expected是期望值。 
actual是测试方法返回值 
如:Assert.assertEquals(5,real);

(2)assertEquals([String message],expected,actual,tolerance) 
tolerance是误差参数,主要是用来比较两个浮点数在误差之内都是相等的。 
如:Assert.assertEquals(5.11,real,0.01);

(3)assertTrue ([String message],Boolean condition) 
condition是待验证的布尔型,主要是用来验证condition是否为真。只有condition为true的情况下,该该测试才能通过。 
如:Assert.assertTrue(isreal);

(4)assertNull([String message],Object object) 
object是待验证的对象,主要是用来验证object是否为null。只有object为null的情况下,该测试才能通过。 
如:Assert.assertNull(null);

(5) assertNotNull([String message],Object object) 
object是待验证的对象,主要是用来验证object是否为非null。只有object为非null的情况下,该测试才能通过。 
如:Assert.assertNotNull(operation);

(6) assertSame ([String message], expected,actual) 
主要是用来验证expected参数和actual参数所引用的是否是同一个对象,只有引用的是同一个对象的的情况下,该测试才能通过。 
如:Assert.assertSame (2,2);

(7) assertNotSame ([String message], expected,actual) 
主要是用来验证expected参数和actual参数所引用的是否是不同对象,只有引用的是不同对象的的情况下,该测试才能通过。 
如:Assert.assertSame (2,1);

(8) Fail([String message]) 
主要是用来验证测试不能达到的分支。

测试异常

@Test(expected…) 
expected是可选的参数,代表不同的测试,如expected=XXException.class) 异常测试,验证测试方法抛出预期的异常;(timeout=xxx)超时测试。

以下为一个简单的测试,测试Operation中的add方法。使用assertEquals判断add方法的返回值与期望值是否相等,只有相等的时候,该测试用例才能通过。

public class Operation(){
public int add(int x,int y){
return x+y;
}
public int multiplic(int x,int y){
return x*y;
}
public float divide(int x,int y){
return x/y;
}
}

测试如下:

public class OperationTest(){
Operation operation;
@Before
public void setUp() throws Exception
{
operation=new Operation();
}
@After
public void afterAllTests() throws Exception
{
operation=null;
}
@Test
public void addTest()
{
int x=2;
int y=3;
int result=operation.add(x,y);
Assert.assertEquals(real,5);
}

@Test(expected = ArithmeticException.class)
public void divideByZero(){
Operation.divide(30);
}

@Test(timeout=100)
public void multiplicTest(){
operation.multiplic(2,3);
}
}

@RunWith注解

以上Junit测试,没有添加@RunWith注解,使用的是Junit默认的Runner运行代码。 
Runner 是一个抽象类,是Junit的核心组成部分,用于运行测试和通知Notifier运行的结果。 
@RunWith测试运行器,放在测试类名之前,确定测试类怎么运行,Junit使用@RunWith实现不同的测试行为。以下是常见的运行器:

(1)@RunWith(Parameterized.class):参数化运行器,配合@Parameters使用JUnit的参数化功能。 
(2)@RunWith(Suite.class):测试集运行器配合使用测试集功能。 
@SuiteClasses({ATest.class,BTest.class,CTest.class}) 
(3)@RunWith(JUnit4.class):JUnit 4的默认运行器 
(4)@RunWith(JUnit38ClassRunner.class):用于兼容junit3.8的运行器 
(5)@RunWith(SpringJUnit4ClassRunner.class):集成了Spring的一些功能。

测试覆盖率

Junit测试,每一个标识为@Test的方法都是一个可以运行的方法,相互之间不影响。在visual studio中,可以执行单个@Test方法。在测试类上,右键run (测试类名)with coverage可以查看测试覆盖率,包括类,方法,代码行。


1 0
原创粉丝点击