public abstract class BaseTest {
protected static HiveTable hiveTable1 = null;
protected static HiveTable hiveTable2 = null;
@Test
public void testHiveMetadata() throws DataConnectorException {
Assert.assertFalse(hiveTable1.exists());
hiveTable1.create();
Assert.assertTrue(hiveTable1.exists());
putRecords(hiveTable1);
Assert.assertEquals(3, hiveTable1.getRecordCount());
Assert.assertFalse(hiveTable2.exists());
hiveTable2.create();
Assert.assertTrue(hiveTable2.exists());
Assert.assertEquals(0, hiveTable2.getRecordCount());
//more code
}
}
public class SomeTest1 extends BaseTest {
@BeforeClass
public static void setUpBeforeClass() throws DataConnectorException {
hiveTable1 = HiveDatasources.getLocalHiveTable1();
hiveTable2 = HiveDatasources.getLocalHiveTable2();
}
}
基本上,abstract
类BaseTest
具有核心测试逻辑,而SomeTest1
等其他类正在填充abstract
类所需的对象。
有SomeTest2
,SomeTest3
和其他一些类使用不同类型的hiveTable对象(例如具有不同文件格式的hive表)进行测试。
根据我的理解,当我mvn clean install
我的项目时,只运行具体类的测试用例。
这是解决这个问题的正确方法吗?
答案 0 :(得分:1)
我的建议是完全不同的:考虑在这里使用继承以避免代码重复时要非常小心。
你知道,单元测试的要点是:它们应该帮助你快速确定生产代码中错误的根本原因(听here关于该主题的一些想法)。
这意味着:单元测试的核心质量是您尽快从失败消息到问题的核心。任何额外的抽象层......都会减慢你的速度。含义:在您的设置中,当测试失败时,您必须了解
在创建此代码后的前两周,这可能不是问题。但是,当你的团队中有新人时,2年后会发生什么?你出去了;然后其中一个测试失败了?!
我的想法:使用合成而不是继承。含义:创建一个提供“测试帮助”方法的辅助类;然后允许一些代码重复,并按顺序为所有你的SomeTest类提供字段和测试方法来进行测试工作。
最后你应该肯定改变一件事:你的一个测试方法中有多个断言。更好地推出并进行多项测试,每项测试都以最大一次断言。