您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
Java单元测试入门
 
   次浏览      
 2019-8-7
 
编辑推荐:
本文来自segmentfault,本文介绍了什么是单元测试,为什么需要单元测试,测试的分类以及Junit和Mock的相关介绍等。

什么是单元测试

定义:单元测试是对软件或程序的基本(最小)组成单元的测试

对象:方法、类

特点:

为什么要写单元测试

需不需要写单元测试

只要程序能运行就可以了,写单元测试浪费时间

代码很简单不需要单元测试

我保证不会有什么问题的

测试人员测试一下就可以了

这次没有时间写了,下次补上吧

测试分类

单元测试->集成测试->端到端测试

各测试占比

Junit介绍

Junit例子

import org.junit.*;
import static org.junit.Assert.fail;

public class ClassNameTest {
@BeforeClass //公开表态无返回值
public static void beforeClass() throws Exception{
//每次测试类执行前执行一次,主要用来初使化公共资源等
}
@AfterClass //公开表态无返回值
public static void afterClass() throws Exception{
//每次测试类执行完成后执行一次,主要用来释放资源或清理工作
}
@Before
public void setup() throws Exception {
//每个测试案例执行前都会执行一次
}
@After
public void teardown() throws Exception {
//每个测试案例执行完成后都会执行一次
}
@Test
public void testMethodName_give_…_when_…_then_…() {
fail("失败");
}
}

常用注解

@Ignore
该注解标记的测试方法在测试中会被忽略

@Test

@Test(expected=xxxException.class) 断言该方法会抛出异常
@Test(timeout=1000) 执行时间超过设置的值该案例会失败

@RunWith

@RunWith(Suite.class) 测试集运行器配合使用测试集功能
@RunWith(JUnit4.class) 默认运行器
@RunWith(Parameterized.class) 参数化运行器
@RunWith(Suite.class)
@Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})

@Rule
public class ExpectedExceptionsTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void verifiesTypeAndMessage() {
thrown.expect(RuntimeException.class);
thrown.expectMessage("Runtime exception occurred");
throw new RuntimeException("Runtime exception occurred");
}
}

参数化

@RunWith(Parameterized.class)
public class PrimeFactorTest {
private PrimeFactor primeFactor;
private int input;
private List<Integer> expected;
//构造函数
public PrimeFactorTest(int input, List<Integer> expected) {
this.input = input;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection init() {
return Arrays.asList(new Object[][]{
{18, Arrays.asList(2, 3, 3)}
});
}
@Test
public void testFactor_when_input_18_then_must_return_2_3_3() {
Assert.assertEquals(expected, primeFactor.factor(input));
}
}

断言

常用的断言方法如下:
assertEquals(a, b) 测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)
assertFalse(a) 测试a是否为false(假),a是一个Boolean数值。
assertTrue(a) 测试a是否为true(真),a是一个Boolean数值
assertNotNull(a) 测试a是否非空,a是一个对象或者null。
assertNull(a) 测试a是否为null,a是一个对象或者null。
assertNotSame(a, b) 测试a和b是否没有都引用同一个对象。
assertSame(a, b) 测试a和b是否都引用同一个对象。
fail(string) Fail让测试失败,并给出指定信息。
assertThat(expected, Matcher) 通过Matcher断言
Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString

建议

使用give when then方式命名你的测试方法名称。

一个案例只写一个断言。

要写注释,建议分为如下4步骤。

测试场景

准备数据

测试执行

断言

Mock介绍

一、mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。

Java常用Mock

EasyMock、JMock、PowerMock、Mockit等

二、Mock工具的原理

mock工具工作的原理大都如下:

record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。

replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。

verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

三、Mockito使用介绍

通过代码创建
1. public class UserServiceTest {
2. private UserService userService;
3. private UserDao mockUserDao;
4. @Before
5. public void setUp() {
6. mockUserDao = mock(UserDao.class);
7. userService = new UserServiceImpl();
8. userService.setUserDao(mockUserDao);
9. }
通过注解
1. public class UserServiceTest {
2.
3. @InjectMocks
4. private UserServiceImpl userService;
5.
6. @Mock
7. private UserDao mockUserDao;
8.
9. @Before
10. public void setUp() {
11. MockitoAnnotations.initMocks(this);
12. }

四、Mockito常用方法

verify
verify(mock, never()).add("twice"); 验证add方法没有被调用
verify(mock, times(2)).add("twice"); 验证add方法被调用了2次
verify(mock, atLeast(n)).someMethod(); 方法至少被调用n次
verify(mock, atMost(n)).someMethod(); 方法最多被调用n次
when
when(mock.someMethod()).thenReturn(value1) .thenReturn(value2);
when(mock.get(0)).thenReturn("first");
when(mock.get(1)).thenThrow(new RuntimeException());
when(mock.get(anyInt())).thenReturn("element");
spy
List spy = spy(new LinkedList());
when(spy.get(0)).thenReturn(“foo");
doReturn("foo").when(spy).get(0);

备注

假如你无法给你程序写单元测试,那么意味着你的程序结构有问题,需要调整或重构。对待测试代码要向生产代码一样,测试代码也需要重构和维护。

 
   
次浏览       
相关文章

微服务测试之单元测试
一篇图文带你了解白盒测试用例设计方法
全面的质量保障体系之回归测试策略
人工智能自动化测试探索
相关文档

自动化接口测试实践之路
jenkins持续集成测试
性能测试诊断分析与优化
性能测试实例
相关课程

持续集成测试最佳实践
自动化测试体系建设与最佳实践
测试架构的构建与应用实践
DevOps时代的测试技术与最佳实践