如何在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'
}
}
当我运行任务时,我的测试不运行。 我已经精确定位这个问题进行相关的定制的运行MyJUnitRunner
上BaseTest
。 如何设置我的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上。)
上一篇: How can I use a custom runner when using categories in Junit?