junit 单元调试场景工具

一个相对复杂的系统,需要多个测试场景的用例。如果你也碰到了以下问题,可以试一下coodex-junit-enhance

  • 需要为每一个测试场景的用例单独输出日志,可是数量是不定的,传统做法也有,每个用例定义一个Logger,然后logging工具配置输出,麻烦
  • 需要模拟时间流逝,天上人间虽然也能做到,但是不管几倍流逝速率,都还是慢,比如说,模拟一个3小时的活动,活动结束后推送消息,哪怕倍率是100倍,依然需要等待1.8分钟,要是一年呢?我们希望越快越好

我们来看一下coodex-junit-enhance怎么解决上面的问题。话不多说,开搞。

测试作用域增加coodex-junit-enhance的依赖

        <dependency>
            <groupId>org.coodex</groupId>
            <artifactId>coodex-junit-enhance</artifactId>
            <version>${coodex.libraries.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- 使用 log4j2 进行记录 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${coodex.libraries.version}</version>
            <scope>test</scope>
        </dependency>

org.coodex.junit.enhance.Log4j2LoggerProvider放到SPI中,本案例使用java默认的SPI

org.coodex.junit.enhance.LoggerProvider

org.coodex.junit.enhance.Log4j2LoggerProvider

测试用例代码

package test.org.coodex.demo;


import org.coodex.junit.enhance.Context;
import org.coodex.junit.enhance.CoodexEnhanceTestRule;
import org.coodex.util.Common;
import org.junit.Rule;
import org.junit.Test;

import static org.coodex.junit.enhance.TestUtils.TIME;
import static org.coodex.junit.enhance.TestUtils.logger;

public class JUnitEnhanceExample {

    // 使用coodex enhance rule
    @Rule
    public CoodexEnhanceTestRule testRule = new CoodexEnhanceTestRule();

    @Test
    @Context(name = "如不指定会用方法名")
    public void test1() {
        logger.info("now {}", Common.now());
        /**
         * 时间跳转到明年元旦,TestUtil.TIME提供了丰富的接口
         *
         * @see org.coodex.junit.enhance.TestUtils.Time
         */
        TIME.nextYear();
        logger.info("now {}", Common.now());
    }

    @Test
    public void test2() {
        logger.info("第二个测试场景");
    }

}

回到前面的问题

  1. 我们没有做任何的log4j2的配置,运行完以后,logs目录下会出现两个案例的日志文件(参见下图),效果就是,你只管加测试用例就行,不需要管logging配置

    logs

  2. 时间流逝,9个ms跑了10个月,支持用通过ExecutorsHelper创建的线程池,TestUtils也有异步执行的接口,支持天上人间,也就是说,你在业务代码中,使用Clock.now(),在测试环境和生产环境都适用

     01:47:16.123 [main] INFO  如不指定会用方法名 - now 2020-03-02 01:47:16
     01:47:16.132 [main] INFO  如不指定会用方法名 - now 2021-01-01 00:00:00
    

同样的,这部分也有扩展点,可以方便的注入测试用例上下文

© coodex.org 2014-2020 all right reserved,powered by GitbookFile Modify: 2020-05-11 14:33:51

results matching ""

    No results matching ""