Gradle:使用注释过滤测试所需的指导

2024-03-26

我们正在开发一个大型测试套件,旨在运行在多种环境上,例如烟雾、性能、全套等。(我们目前使用 JUnit 作为测试框架。)我们想要实现的是注释测试(类或方法或两者)带有一个或多个注释,例如@SmokeTest, @PerformanceTest, @AcceptanceTest然后在其中添加一些测试任务build.gradle根据这些注释运行特定选择的测试。这个想法很像this one http://forums.gradle.org/gradle/topics/gradle_test_discovery_using_annotations_rather_than_a_regex_against_the_filename来自 Gradle 论坛。

我知道 Gradle 可以基于 JUnit 注释检测 JUnit 测试(请参阅 23.12.4. 中的测试检测)Gradle 用户指南 http://www.gradle.org/docs/current/userguide/java_plugin.html)。但是,我不知道如何利用该功能并添加一些我自己的自定义逻辑。我正在寻找如下所示的内容:

  1. 根据一个或多个给定注释检测测试(包括或 排除)
  2. 将检测到的测试添加到某种容器中。
  3. 有一个测试任务在容器中运行测试。

因此,我想询问您可以提供任何指导来实现该功能。非常感谢。


经过一番研究,我想我现在有了解决方案。我创建github 上的演示项目 https://github.com/JianbaoTao/tests-in-parallel。 (该项目的名称有点误导:-])。

我还想在这里粘贴解决方案的核心逻辑,该逻辑是从build.gradle在演示项目中:

List testClassNames() {
    File classesDir = sourceSets.test.output.classesDir
    String prefix = classesDir.toString() + '/'
    List names = []
    classesDir.traverse {
        if( it.absolutePath.endsWith( '.class' ) ) {
            String name = (it.absolutePath - prefix).replaceAll( '/', '.' ) - '.class'
            names << name
        }
    }
    return names
}

ClassLoader getClassLoader() {
    List urls = sourceSets.test.runtimeClasspath.collect {
        it.toURI().toURL()
    }
    return URLClassLoader.newInstance( urls as URL[] )
}

List annotationFilter( Map map ) {
    map.prefix = map?.prefix ?: '' // prefix: provide convenience for passing in annotation names

    ClassLoader loader = classLoader

    List result

    // filter with annotations
    if( !map.includes ) {
        result = map?.names
    } else {
        result = []
        map?.names.each { name ->
            Class klass = loader.loadClass( name )
            map?.includes.each { annotationName ->
                String fullName = map.prefix + annotationName
                Class<? extends Annotation> annotation = loader.loadClass( fullName ).asSubclass( Annotation )
                if( klass.isAnnotationPresent( annotation ) ) {
                    result << name
                }
            }
        }
    }

    if( result?.size() == 0 ) result = [ 'no.tests.to.run' ]
    return result
}

task smoke( type: Test, description: 'Run smoke tests' ) {
    doFirst {
        List names = testClassNames()
        List filtered = annotationFilter( names: names, includes: ['demo.Smoke'] )
        println 'Running ' + filtered.size() + ' tests:\n' + filtered*.toString()*.replaceAll('^','\t').join('\n')

        filter {
            setIncludePatterns( filtered as String[] )
        }
    }
}

正如您在上面看到的,smoke任务只会执行带有注释的测试@Smoke.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle:使用注释过滤测试所需的指导 的相关文章

随机推荐

  • Flask-SQLAlchemy 和 Flask-Restless 不获取孙子

    Problem 我正在 Flask Flask SQLAlchemy 和 Flask Restless 上构建一个应用程序 我使用 Restless 生成了一个用于父子孙关系的 API 我的孩子上的 GET 将正确获取孙子 但父母上的 GE
  • 如何减少部署时的 Docker 映像大小?

    所以我刚刚创建了一个非常基本的 Node 应用程序 我想练习将其放入docker容器中并部署到另一台服务器上 我正在使用这里的步骤 https nodejs org en docs guides nodejs docker webapp h
  • 跳过 FlatFileParseException 或 Spring Batch 中的特定异常

    您好 我需要读取 n 个 平面文件 在文件读取期间 如果从读取器收到 FileParseException 则停止当前文件读取并安全退出并处理下一个文件并继续作业执行 目前我有这个 xml 配置 但我不想这样做 因为我没有真正的跳过限制计数
  • 春云|假装 Hytrix |首次调用超时

    我有一项服务使用了 3 个假客户端 每次启动应用程序时 我都会在第一次调用任何假客户端时收到 TimeoutException 在一切稳定之前 我必须至少触发每个假客户端一次 在网上查了一下 问题是 feign 或 hystrix 内部的某
  • 通过隧道颠覆

    对于工作 我在一个封闭的网络中工作 我们设置了一些只能从我们的网络内部访问的 IP 地址 不过 有一个盒子 我们可以通过 SSH 进入并通过隧道到达我们各自的开发者盒子 我知道我可以通过使用以下方式从我们的开发者盒子获得流量 Lssh 的参
  • 找到 3x3 打孔的所有组合

    我参加了一个嘉年华 在每个地点 他们都会用特殊的打孔器标记您的节目 打孔器是一个 3x3 空间的网格 在每个空间中 要么有一根大头针刺破你的纸 要么没有 这让我想知道你可以用这个工具制作多少种不同的图案 我的第一个想法是 2 9 512 但
  • 在 pypy 中调用 python 文件

    我最近搬到了 PyPy 它的速度快得惊人 但是很多 python 库还没有实现 所以我有很多自制的 python 函数 我想在 PyPy 代码中调用它们 这是我的问题 有没有办法在 PyPy 中调用 python 文件或函数 并向其传递一些
  • 带有 Entity Framework 4 指南的多语言数据库

    我们正在创建一个大型电子商务数据库 需要支持多种语言的数据 例如 产品表将需要名称 描述 元标题 元关键字 元描述等的一项或多项翻译 从关系数据库设计的角度来看 有多种方法可以实现这一点 但 Entity Framework 4 添加了一些
  • 在 Android 中使用拨号盘启动应用程序

    我想通过拨号盘启动我的应用程序 我使用以下代码 用于拨号盘启动应用程序 在广播接收器中 public class HiddenReceiver extends BroadcastReceiver Override public void o
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

    我正在尝试将 hibernate orm 映射工具配置到我的 java 类 并使用 PostgreSQL 作为我的数据库 并将密码配置为 password 当我尝试运行该应用程序时 我在控制台日志中遇到错误 如下所示无法创建请求的服务 or
  • 社交网站的数据库设计

    社交网站 例如 Twitter 中会出现哪些表格 到目前为止我有一个用户表 如何跟踪关注者和我关注的人 我应该为关注者和我关注的人维护一个单独的表吗 这些表中会有哪些列 请不要认为这是主观 偏离主题的 由于我是初学者 我想专家可以指导我获得
  • 如何通过 React JS 博览会正确从 Firebase 实时数据库获取随机节点

    跟进问题来自在控制台中记录变量时出现引用错误 https stackoverflow com questions 75509803 referenceerror when the variable is being logged in co
  • django 表单 - 从 clean() 引发特定字段验证错误

    我对依赖于多个字段的表单进行了验证检查 但最好让验证错误向用户具体显示哪些字段导致了问题 而不仅仅是表单顶部的错误消息 该表单有很多字段 因此可以更清楚地具体显示错误所在 作为解决方法 我尝试在每个相关字段中创建相同的验证clean fie
  • GoldenLayout,如何隐藏/显示组件?

    我有一个基于 GoldenLayout 1 5 9 的应用程序 布局是包含两列的行 请参阅下面我感兴趣的列的配置 let config content type row content type column width 31 conten
  • 用另一条具有相同位置但使用“geom_curve”在“ggplot2”中切割开头和结尾的曲线重叠绘制曲线

    我有一个df带有曲线信息 df lt data frame x c 0 0 1 1 xend c 0 1 1 0 y c 0 1 0 1 yend c 1 0 1 1 curvature c 2 5 1 1 我可以用单独的曲线绘制这些曲线c
  • Laravel Eloquent toArray 不使用方括号

    我正在编写一个 api 并尝试将一些结果转换为 JSON 当雄辩的结果转换为数组时 我期待这样的结果 id 0 id 相反 Laravel 使用表键将其显示为键 值列表 0 id 0 1 id 1 这是函数 results App Even
  • Angular Bootstrap Modal:未知提供者:$modalInstanceProvider

    我正在尝试使用 Angular Bootstrap Modal 指令 http angular ui github io bootstrap http angular ui github io bootstrap 如下 在我的控制器中打开模
  • 这个 Haskell 函数的类型签名是什么?

    我写了一个函数来检查一个数字是否是质数 prime n prime n 2 floor sqrt n where prime n c u n mod c 0 False c gt u True otherwise prime n c 1 u
  • Swift 可选链在闭包中不起作用

    我的代码看起来像这样 我的班级有一个可选的变量 var currentBottle BottleLayer BottleLayer有一个方法jiggle 这段代码使用可选链接 在我的类中编译得很好 self currentBottle ji
  • Gradle:使用注释过滤测试所需的指导

    我们正在开发一个大型测试套件 旨在运行在多种环境上 例如烟雾 性能 全套等 我们目前使用 JUnit 作为测试框架 我们想要实现的是注释测试 类或方法或两者 带有一个或多个注释 例如 SmokeTest PerformanceTest Ac