定义:单元测试是对软件或程序的基本(最小)组成单元的测试
对象:方法、类
特色:less
只要程序能运行就能够了,写单元测试浪费时间
代码很简单不须要单元测试
我保证不会有什么问题的
测试人员测试一下就能够了
此次没有时间写了,下次补上吧函数
单元测试->集成测试->端到端测试工具
各测试占比单元测试
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
建议测试
要写注释,建议分为以下4步骤。ui
1、mock就是在测试过程当中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来建立以便测试的测试方法,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
Java经常使用Mock
EasyMock、JMock、PowerMock、Mockit等this
2、Mock工具的原理
mock工具工做的原理大都以下:spa
3、Mockito使用介绍3d
经过代码建立 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. }
4、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);
假如你没法给你程序写单元测试,那么意味着你的程序结构有问题,须要调整或重构。对待测试代码要向生产代码同样,测试代码也须要重构和维护。
3Q