单元测试设计原则

来源:互联网 发布:cisco查看端口流量 编辑:程序博客网 时间:2024/06/05 00:34

背景

为了提高开发人员的代码质量,编写高质量的单元测试,要遵守3R(Responsible, Reliable, Repeative)原则,具体含义如下:

  • Responsible: 谁开发谁负责测试,在哪里开发就在哪里测试。
  • Reliable: 测试case要可靠,并且是值得信赖的,对于底层的任何改动都要能够及时感知。
  • Repeative: 所有单元测试用例都要能够重复运行。能够重复运行就能够进行回归测试、覆盖率统计等等。

方案

  1. 如何做到Responsible?
    开发在完成一个方法,或者一个类之后,就要及时得进行单元测试;不能在对应方法或类的调用处进行测试,比如两个模块A、B,A是基础模块,为模块B提供服务,那么所有A模块的单元测试case都应该在A模块的内部进行测试。
  2. 如何做到Reliable?
    为了使得测试用例尽量可靠,就要减少mock的使用(对于第三方的调用可以使用mock),对每层代码的测试都要完全依赖于下层,不能mock下层逻辑。因此引入递进集成的概念,比如测试DAO时要连接真实的数据库,测试Service时要使用真实的DAO、DB, 测试Controller层的代码,要使用真实的Service、DAO、DB,以此类推。这样就可以最大限度的提高case的可靠性。
  3. 如何做到Repeative?
    必须要做到case间完全解耦,没有任何的依赖,这包括和数据库的依赖以及第三方的依赖。case解耦可以通过准备测试数据、mock第三方调用来解决。
  4. 如何进行自动断言?
    可以使用junit的断言,或者hamcrest提供的assertThat断言。
  5. 如何同时使用多个junit默认执行类?比如同时使用@RunWith(DataProviderRunner.class)和@RunWith(SpringJUnit4ClassRunner.class)。
    junit类是不能同时添加多个默认执行类的,此时可以通过编程,将默认执行类所做的工作放在@Before方法来完成。
    privateTestContextManager testContextManager;
    @Before
    publicvoid setUpContext() throwsException {
        //this is where the magic happens, we actually do "by hand" what the spring runner would do for us,
        // read the JavaDoc for the class bellow to know exactly what it does, the method names are quite accurate though
        this.testContextManager = newTestContextManager(getClass());
        this.testContextManager.prepareTestInstance(this);
    }
  6. END

0 0
原创粉丝点击