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

问题描述 投票:0回答:1

我正在编写一个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 junit
1个回答
0
投票

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才能实现。

© www.soinside.com 2019 - 2024. All rights reserved.