我正在编写一个gradle脚本,该脚本在进行构建之前会运行所有测试。
test {
filter {
includeTestsMatching "*TestAll*"
includeTestsMatching "*ExtensionValidatorTest*"
........
}
}
我有三个不同版本的测试(v1,v2,v3)。
TestAll.java
package .....v1;//v2 for version 2 and v3 for version 3
@RunWith(Suite.class)
@Suite.SuiteClasses({
A.class,
B.class,
......
})
public class TestAll {
@BeforeClass
public static void setUp() {//connection to database
........
}
@AfterClass
public static void tearDown() {//close database connection
........
}
}
当我运行gradle test
时,执行特定的TestAll后,与数据库的连接断开。我不想更改任何版本的TestAll文件,因为它们可以独立运行和测试。我怎样才能让gradle仅运行一次(任何版本的)setUp建立连接,然后运行v1,v2和v3中的所有TestAll方法,最后运行拆卸(任何版本)以终止数据库连接。
Gradle对此无济于事。 Gradle DSL中有以下方法:
test {
beforeSuite{...}
afterSuite{...}
}
但是,它们在测试运行时范围之外执行,并打算记录。您只能使用测试框架来实现。
[TestNG提供了一个简单的解决方案-@BeforeSuite
和@AfterSuite
批注,它们实际上在整个套件之前和之后运行一次。
不幸的是,JUnit没有内置的解决方案,因为测试隔离是其核心概念。不过,您仍然可以自己制作。您需要将与数据库相关的API封装到一个singleton类中:
public class DbContainer() {
private static DbContainer container;
private DbContaner() {}
public DbContainer getInstance() {
if (container == null) {
container = new DbContainer()
}
return container;
}
public void openConnection() {
// ...
}
public void closeConnection() {
// ...
}
// here is your database API methods
}
然后您可以使用@ClassRule
注释在测试方法和类之间共享此实例:
@ClassRule
public static DbContainer db = DbContainer.getInstance();
@Test
public void someTest() {
db.query(...)
}
注:提供的解决方案不是线程安全的,因此不适合并行执行。需要一些additional effort才能实现。