簡體   English   中英

Junit 測試用例中的代碼可重用性

[英]Code reusability in Junit Test cases

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. Ups,在你被告知測試失敗的課程中實際上沒有@Test 方法
  2. 所以你必須想:啊,它是在一些基類中定義的
  3. 然后你開始閱讀那里......想:“哦,事情是如何設置的?!
  4. 回到你失敗的測試課

也許在創建此代碼后的前兩周這不是問題。 但是兩年后,當你的團隊中有新人時會發生什么? 你出去了; 然后其中一項測試失敗了?!

我的想法是:不要使用繼承,而是使用組合。 含義:創建一個提供“測試助手”方法的助手類; 然后允許一些代碼重復,並按順序為所有SomeTest 類提供字段和測試方法來完成測試工作。

最后,你絕對應該改變的一件事是:你的一個測試方法中有多個斷言。 最好推出並進行多項測試,每項測試最多執行一次斷言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM