如何在Junit中使用类别时使用自定义运动员?

我有一堆JUnit测试,它们扩展了我的基本测试类BaseTest ,它又扩展了Assert 。 我的一些测试有一个@Category(SlowTests.class)注释。

我的BaseTest类使用以下注释@RunWith(MyJUnitRunner.class)注释。

我已经设置了一个Gradle任务,预计只能运行SlowTests 。 这是我的Gradle任务:

task integrationTests(type: Test) {
    minHeapSize = "768m"
    maxHeapSize = "1024m"
    testLogging {
        events "passed", "skipped", "failed"
        outputs.upToDateWhen {false}
    }
    reports.junitXml.destination = "$buildDir/test-result"
    useJUnit {
        includeCategories 'testutils.SlowTests'
    }
}

当我运行任务时,我的测试不运行。 我已经精确定位这个问题进行相关的定制的运行MyJUnitRunnerBaseTest 。 如何设置我的Gradle或测试结构,以便在使用Suite时可以使用自定义运动员。


解决这个问题的办法变得比我想象的要小和棘手。 Gradle正在使用我的自定义测试运行filter并正确调用filter方法。 但是,我的runner通过自己的类加载器为Javaassist增强功能重新加载所有测试类。

这导致了SlowTest注释通过Gradle类加载器加载的问题,但是当传递给我的自定义运行器时,运行器检查该类是否使用该注释注释。 由于通过两个不同的类加载器加载的SlowTest注释的等SlowTest不同,此检查从未正确解析。

-

由于我已经完成了这项研究,所以我将在此留下。 经过Gradle和(神秘的)JUnit资源挖掘了几天之后,我得到了这些。

除了测试分类之外,Gradle并不处理任何高级JUnit功能。 当您使用包含类别或排除类别条件创建Gradle任务时,它会构建一个CategoryFilter。 如果您不知道, Filter是JUnit提供给测试运行者的信息,用于决定是否应该过滤测试或测试方法。 测试运行者必须实现可Filterable界面。

JUnit带有多个跑步者, Categories只是其中的一个。 它扩展了一个名为Suite的测试运行者家族。 这些基于套件的跑步者旨在运行“套件”测试。 一套测试可以通过注释自省来构建,通过明确定义套件中的测试或者任何其他构建测试套件的方法。

Categories的情况下,JUnit有它自己的CategoryFilter但Gradle不使用它,它使用它自己的CategoryFilter 。 两者都提供或多或少相同的功能,并且是JUnit过滤器,因此任何实现Filterable套件都可以使用它们。

负责运行JUnit测试的Gradle中的实际类称为JUnitTestClassExecuter 。 一旦它解析了命令行选项,它就会请求JUnit检查运行器是否应该用于测试。 如此处所示,每个测试都会调用此方法。

其余的只是JUnit。 Gradle刚刚创建了一个自定义RunNotifier来生成代表测试结果的标准XML文件。

我希望有人发现这个有用,并节省了无数小时的调试。

TLDR:您可以在Gradle中使用任何跑步者。 Gradle没有关于跑步者的具体细节。 这是JUnit决定参赛者。 如果你想知道你的测试将使用哪个runner,你可以通过调用Request.aClass(testClass).getRunner()来进行调试。 将此文件解压到您的代码库并将其打印到控制台。 (我没有成功地将调试器附加到Gradle上。)

链接地址: http://www.djcxy.com/p/93711.html

上一篇: How can I use a custom runner when using categories in Junit?

下一篇: Switch query from traditional MySQL to PDO Format