我们正在开发一个大型测试套件,旨在运行在多种环境上,例如烟雾、性能、全套等。(我们目前使用 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)。但是,我不知道如何利用该功能并添加一些我自己的自定义逻辑。我正在寻找如下所示的内容:
- 根据一个或多个给定注释检测测试(包括或
排除)
- 将检测到的测试添加到某种容器中。
- 有一个测试任务在容器中运行测试。
因此,我想询问您可以提供任何指导来实现该功能。非常感谢。
经过一番研究,我想我现在有了解决方案。我创建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(使用前将#替换为@)