步骤0. 前提须知
Category 即测试分类标签,决定了该测试用例在哪套测试环境或流程中被测试。步骤1. 测试用例打标签
在测试用例类或者测试用例方法前加上合适的Category,可以是任意期望的测试分类标签的集合。
真实样例,下面三个测试类的Category都是真实有效的,
@Category({LocalStandaloneTest.class, ClusterTest.class, RemoteTest.class}) public class IoTDBAliasIT { ...... } @Category({LocalStandaloneTest.class, ClusterTest.class}) public class IoTDBAlignByDeviceIT { ...... } @Category({LocalStandaloneTest.class}) public class IoTDBArithmeticIT { ...... }
甚至,你还可以在测试方法级别加Category。
@Category({LocalStandaloneTest.class}) public class IoTDBExampleIT { // This case can ONLY test in environment of local. @Test public void theStandaloneCase() { ...... } // This case can test in environment of local, cluster and remote. @Test @Category({ClusterTest.class, RemoteTest.class}) public void theAllEnvCase() { ...... } }
目前,所有测试用例至少要加上单机测试的测试分类,即LocalStandaloneTest.class。
步骤2. 环境代码重构
如果测试用例需要在Cluster或者Remote环境下被测试,那么必须对环境相关的代码作相应重构,如果是仅在LocalStandalone环境下测试,则只推荐修改。(不是所有的测试用例可以在Cluster或者Remote环境下被测试,因为受限于部分功能的语句比如本地文件操作,这些代码不能被重构。)
| LocalStandalone | Cluster | Remote | |
|---|---|---|---|
| setUp and tearDown | Recommend | Must | Must |
| getConnection | Recommend | Must | Must |
| change config | Recommend | Must | Not support |
| Local file operation | Won't change | Not support | Not support |
| Local descriptor operation | Won't change | Not support | Not support |
| restart operation | Won't change | Not support | Not support |
setUp 和tearDown 方法内的重构,在Cluster和Remote环境下是必须更改的
@Category({LocalStandaloneTest.class, ClusterTest.class, RemoteTest.class}) public class IoTDBAliasIT { @BeforeClass public static void setUp() throws Exception { // EnvironmentUtils.closeStatMonitor(); // orginal setup code // EnvironmentUtils.envSetUp(); // orginal setup code EnvFactory.getEnv().initBeforeClass(); // new initBeforeClass code insertData(); } @AfterClass public static void tearDown() throws Exception { // EnvironmentUtils.cleanEnv(); // orginal code EnvFactory.getEnv().cleanAfterClass(); // new cleanAfterClass code } }
getConnection 的重构,在Cluster和Remote环境下是必须更改
private static void insertData() throws ClassNotFoundException { // Class.forName(Config.JDBC_DRIVER_NAME); // orginal connection code // try (Connection connection = // DriverManager.getConnection( // Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root"); try (Connection connection = EnvFactory.getEnv().getConnection(); // new code Statement statement = connection.createStatement()) { for (String sql : sqls) { statement.execute(sql); } } catch (Exception e) { e.printStackTrace(); } }
更改配置的方法,在Cluster环境下是必须重构的。(由于目前Remote环境无法远程更改配置,更改配置的测试用例将不支持Remote环境下测试)
ConfigFactory.getConfig() 的方法可以进行链式更改。@Category({LocalStandaloneTest.class, ClusterTest.class}) public class IoTDBCompleteIT { private int prevVirtualStorageGroupNum; @Before public void setUp() { prevVirtualStorageGroupNum = IoTDBDescriptor.getInstance().getConfig().getVirtualStorageGroupNum(); // IoTDBDescriptor.getInstance().getConfig().setVirtualStorageGroupNum(16); // orginal code ConfigFactory.getConfig().setVirtualStorageGroupNum(16); // new code EnvFactory.getEnv().initBeforeClass(); }
ConfigFactory.getConfig() 的方法中包含,需要在BaseConfig.java接口文件中定义,在StandaloneEnvConfig.java和ClusterEnvConfig.java中分别实现,这部分不是很常用,具体方法可以参考已实现的部分,目前暂不列出。