gpt4 book ai didi

gradle - 如何在gradle中编写执行特定方法的脚本?

转载 作者:行者123 更新时间:2023-12-03 05:24:31 24 4
gpt4 key购买 nike

我正在编写一个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

关于gradle - 如何在gradle中编写执行特定方法的脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61987156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com