首页 > 技术文章 > 单元测试

esther-qing 2017-11-29 10:53 原文

被测系统(System Under Test,SUT):正在被测试的系统。

测试替身:

测试夹具:测试运行程序(test runner)会在测试方法之前自动进行初始化、资源回收的工作。

测试套件(test suite):

一个测试用例可以包含多个打上@Test注解的测试方法。

一、TestNG

TestNG是一种基于注解的测试框架。其生命周期为:类级初始化资源处理、方法级初始化资源处理、执行测试用例中的方法、方法级销毁资源处理、类级销毁资源处理。其中类级的资源处理在一个测试用例中执行一次。方法级的资源处理在每个方法中都运行一次。

如果在一个测试用例中有多个初始化方法,运行时先执行最后面的初始化方法,然后往前一个个运行。对于多个销毁资源的方法,按照顺序一个个运行。

public class TestNG {
    private User user;

    @Before
    public void before() {
        System.out.println("before method----------");
        user = null;
    }
    @Before
    public void before2() {
        System.out.println("before method2----------");
        user = null;
    }


    @After
    public void after() {
        System.out.println("after method---------");
    }

    @BeforeClass
    public static void beforeClass() {
        System.out.println("before class----------");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("after class---------");
    }


    @Test
    public void test1() {
        System.out.println(1);
    }


    @Test
    public void test2() {
        System.out.println(2);
    }

    @Test
    public void test3() {
        System.out.println(3);
    }


    // 10毫秒
    @Test(timeout = 10,expected = NullPointerException.class)
    public void testNull() {
        Assert.assertNotNull(user.getUserRealName());
        System.out.println(user.getUserRealName());
    }

    @Test
    public void test() {
        boolean flag = 1 > 2;
        assert flag : "flag is false";
    }
}

  

二、模拟利器Mockito

对于final类、匿名类和java的基本类型无法进行mock。

创建Mock对象:mock(Class<T>)和 @Mock注解。 

设定Mock对象的期望行为和返回值:

when(mock.someMethod()).thenReturn(value); 

doReturn(value).when(mock).someMethod();

doNothing(value).when(mock).someMethod();

验证交互行为:verify(mock,atLeast(2)).someMethod();

public class MockitoTest {
    IUserService mockUserService = mock(IUserService.class); // 对接口模拟对象
    UserServiceImpl mockUserServiceImpl = mock(UserServiceImpl.class); // 对类模拟对象

    @Mock
    User user; // 基于注解模拟类

    @Before
    public void initMocks() {
        // 初始化所有@Mock注解模拟对象
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMock() {
        when(mockUserService.getUserByNameAndPwd("tom","111")).thenReturn(
                new User("tom","111","tom","male",20)
        );
        User u=mockUserService.getUserByNameAndPwd("tom","111");
        Assert.assertNotNull(u);
        Assert.assertEquals(u.getUserRealName(),"tom");

        when(user.getAge()).thenReturn(30);
        Assert.assertEquals(user.getAge().longValue(),30l); 
     verify(mockUserService).getUserByNameAndPwd("tom","111");
     verify(mockUserService,atLeastOnce()).getUserByNameAndPwd("tom","111");
} }

三、测试整合之王Unitils

 

 

                           

 

推荐阅读