单元测试之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识别为测试方法,其他注解如下:
- @BeforeClass: 所有测试开始之前运行,一个类中只出现一次。必须为public static void
@BeforeClass
public static void runBeforeClass() {
// 多个用例公用的部分
//如数据库连接、读取文件
}
- @AfterClass: 所有测试结束之后运行,一个类只出现一次,必须为public static void。对应BeforeClass。
@AfterClass
public static void runAfterClass() {
//
}
- @Before: 每一个测试方法之前运行
@Before
public void setUp() throws Exception{
operation=new Operation();
}
- @After : 每一个测试方法之后运行
@After
public void afterAllTests() throws Exception{
operation=null;
}
@Test : 测试方法,测试程序会运行的方法。
@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(3,0);
}
@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可以查看测试覆盖率,包括类,方法,代码行。
- 单元测试之JUnit4
- Junit4.*单元测试
- JUnit4单元测试
- JUnit4单元测试
- Junit4 单元测试
- JUnit4单元测试
- JUnit4单元测试
- JUnit4单元测试
- junit4单元测试
- Junit4 单元测试
- JUnit4单元测试
- Junit4单元测试
- junit4单元测试
- JUnit4单元测试
- Junit4单元测试
- Junit4单元测试
- junit4单元测试小例子
- junit4.0单元测试
- 强连通分量
- 堆排序(2)
- Android:OpenGL笔记
- MySql、SqlServer、Oracle数据库行转列大全
- 日记: CreateProcess D7 to XE , Access Violation kernel32.dll
- 单元测试之JUnit4
- Google官方关于Android架构中MVP模式的示例
- 程序员常用的自助建站资源汇总!
- angularjs 弹出框 $modal
- 引用于指针的区别(java如何寻址)
- JSON解析多解析类问题(二)
- freemarker template error
- 服务熔断、降级、限流、异步RPC -- HyStrix
- 实验记录-linux基础