OSGi Testsuite是一个JUnit测试运行程序 ,它动态地收集要执行的测试类。 它已经由我的同伴Rüdiger大约一年前出版,并且已经在某些项目中证明是有用的。 但是对于gonsole,我们必须使用一个难看的补丁,因为1.0版仅支持.*Test
后缀匹配测试类名称。
我通过引入注解@ClassnameFilters
(使用正则表达式匹配任意名称模式)解决了1.1版的问题。 这篇文章简短地解释了它是如何工作的。
OSGi测试套件
OSGi Testsuite提供了一个JUnit测试运行程序BundleTestSuite
,可用于运行给定数量的OSGi捆绑包内的所有测试。 要使用它,请使用@RunWith(BundleTestSuite.class)
注释一个类,并使用@TestBundles({"bundle.1", ...})
指定捆绑。 运行时,JUnit将处理列出的捆绑软件中的所有类,其名称以'Test'
结尾。
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
public class MasterTestSuite {}
不幸的是,Test postfix的固定结果显得过于僵化。 在gonsole中,我们对单元测试和集成测试使用不同的后缀。 而且,我们不希望在OSGi Testsuite运行中执行单元测试。 但是这种区别在1.0版中是不可能的。
类名过滤器
受ClasspathSuite (在纯JUnit测试上与OSGi Testsuite的工作原理类似)的启发,我引入了一个注解@ClassnameFilters
。 这允许基于正则表达式定义过滤器以匹配任意测试名称模式:
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
@ClassnameFilters( { ".*ITest" } )
public class IntegrationTestSuite {}
处理该示例将包括列出的捆绑软件中所有类的测试,这些测试的名称以'ITest'
后缀结尾。 请注意,带有简单'Test'
后缀的类将不被处理。
此外,可以使用前导'!'
指定排除模式 :
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
@ClassnameFilters( { ".*ITest", "!.*FooITest" } )
public class IntegrationTestSuite {}
给定的示例现在将执行列出的捆绑软件中所有类的测试,这些类的名称以'ITest'
后缀结尾,但名称以'FooITest'结尾的类除外。 很简单,不是吗?
结论
OSGi Testsuite的过滤器机制得到了增强,可以动态执行与任意名称模式匹配的测试类。 使用ClassnameFilters
批注和正则表达式可以轻松完成过滤器规范。
该代码可在Eclipse Public License下获得,并托管在GitHub上:
https://github.com/rherrmann/osgi-testsuite
可以从此p2存储库获得最新的稳定版本:
http://rherrmann.github.io/osgi-testsuite/repository
翻译自: https://www.javacodegeeks.com/2014/11/osgi-testsuite-introducing-classname-filters.html