【问题标题】:Collect JUnit Test Metadata via Annotations通过注解收集 JUnit 测试元数据
【发布时间】:2021-07-15 01:21:35
【问题描述】:

是否有我可以在 JUnit 中实现的类/方法,它基本上是一个“挂钩”,在每个测试用例完成后运行,并提供用户定义的(在代码中)元数据?

我正在尝试完成这样的事情:

  • 使用用户定义的注释来注释测试用例,例如团队所有权(例如@Team(Teams.PAYMENTS)
  • 使用 3 个值将测试结果打印到控制台:测试名称(测试函数名称)、状态(通过/失败)和团队(注释值)

为简单起见,我只需要打印此信息(稍后将在其他地方发布),但我真的迷失在在哪里我可以在一个地方获得此测试元数据信息,之后试运行?

我试图在我们的 TestRunner 类之一中覆盖完成方法:

    override fun finish(resultCode: Int, results: Bundle?) {
        System.out.println("===breakpoint here===")

        super.finish(resultCode, results)
    }

但是在调试的时候,这里没有测试元数据。关于如何解决这个问题的任何建议?

谢谢!

【问题讨论】:

    标签: java junit junit4 android-junit


    【解决方案1】:

    对于 JUnit 4,您可以使用 TestWatcher 规则:

    import org.junit.Assert;
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.rules.TestWatcher;
    import org.junit.runner.Description;
    
    public class TestWatcherAPIUnitTest {
    
        @Rule(order = Integer.MIN_VALUE)
        public TestWatcher watchman = new TestWatcher() {
            @Override
            protected void failed(Throwable e, Description description) {
                System.out.println(description + " Team: " + getTeam(description) + " failed!");
            }
    
            @Override
            protected void succeeded(Description description) {
                System.out.println(description + " Team: " + getTeam(description) + " success!");
            }
    
            String getTeam(Description description) {
                Team team = description.getAnnotation(Team.class);
                return (team != null) ? team.value() : "unknown_team";
            }
    
    
        };
    
        @Test
        @Team("team1")
        public void failing_test() {
            Assert.assertTrue(false);
        }
    
        @Test
        @Team("team2")
        public void successful_test() {
            Assert.assertTrue(true);
        }
    }
    

    同样,对于 JUnit5,有一个 TestWatcher API

    【讨论】:

    • 这真的很好,谢谢@Lesiak!这条规则的范围似乎仅限于这个特定的类 - 有没有办法在通过特定测试运行器的任何测试用例中应用规则?
    • 显然可以做到,通过子类化运行器来包含规则(虽然我没有尝试过)请注意,上面的规则可以在单独的类中定义,这比每次都将其定义到位。见stackoverflow.com/questions/7639353/…
    • 我会尝试结合这两个答案并尝试这种方法。感谢@Lesiak 的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2013-01-21
    • 2012-01-19
    • 2019-10-20
    相关资源
    最近更新 更多