2016-10-28 30 views
7

我有一堆JUnit测试扩展了我的基本测试类BaseTest,这又扩展了Assert。我的一些测试有一个@Category(SlowTests.class)注释。如何在Junit中使用类别时使用自定义运动员?

我的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' 
    } 
} 

当我运行任务时,我的测试不运行。我已经指出这个问题与BaseTest上的定制跑步者MyJUnitRunner有关。如何设置我的Gradle或测试结构,以便在使用Suite时可以使用自定义亚军。

+0

我认为如果您发布了您的跑步者,样本测试或BaseTest会很有帮助。它对类别跑步者运行良好吗? – MrKiller21

+0

@ MrKiller21我编辑了我的答案。请看下面。 –

回答

3

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

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

-

既然我已经做了研究,我就离开这个位置。经过Gradle和(神秘的)JUnit资源挖掘了几天之后,我得到了这些。

Gradle根本不处理除测试分类之外的任何高级JUnit功能。当您使用包含类别或排除类别条件创建Gradle任务时,它会构建一个CategoryFilter。如果您不知道,JUnit会给测试运行者一个决定是否应该过滤掉测试或测试方法的东西Filter。测试运行者必须实现Filterable接口。

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

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

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

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

我希望有人认为这有用,并保存自己无数小时的调试。

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

相关问题