Junit测试用例中的代码可重用性

时间:2016-10-12 15:54:56

标签: java junit

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();
    }
}

基本上,abstractBaseTest具有核心测试逻辑,而SomeTest1等其他类正在填充abstract类所需的对象。

SomeTest2SomeTest3和其他一些类使用不同类型的hiveTable对象(例如具有不同文件格式的hive表)进行测试

根据我的理解,当我mvn clean install我的项目时,只运行具体类的测试用例。

这是解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:1)

我的建议是完全不同的:考虑在这里使用继承以避免代码重复时要非常小心。

你知道,单元测试的要点是:它们应该帮助你快速确定生产代码中错误的根本原因(听here关于该主题的一些想法)。

这意味着:单元测试的核心质量是您尽快从失败消息到问题的核心。任何额外的抽象层......都会减慢你的速度。含义:在您的设置中,当测试失败时,您必须了解

  1. Ups,在课程中实际上有没有 @Test方法,你被告知测试失败
  2. 所以你要想:啊,它是在某个基类中定义的
  3. 然后你开始在那里阅读...想:“哦,以及如何设置?!
  4. 回到失败的测试课程
  5. 在创建此代码后的前两周,这可能不是问题。但是,当你的团队中有新人时,2年后会发生什么?你出去了;然后其中一个测试失败了?!

    我的想法:使用合成而不是继承。含义:创建一个提供“测试帮助”方法的辅助类;然后允许一些代码重复,并按顺序为所有你的SomeTest类提供字段和测试方法来进行测试工作。

    最后你应该肯定改变一件事:你的一个测试方法中有多个断言。更好地推出并进行多项测试,每项测试都以最大一次断言。