JavaRush /Java Blog /Random-TW /喝咖啡休息#87。為什麼單元測試對開發人員很重要?在 Java 中複製數組的 5 種方法

喝咖啡休息#87。為什麼單元測試對開發人員很重要?在 Java 中複製數組的 5 種方法

在 Random-TW 群組發布

為什麼單元測試對開發人員很重要?

來源:SearchSoftwareQuality 讓我們討論為什麼單元測試很重要且有價值,以及它如何讓偵錯變得更容易。單元測試是提高軟體品質的強大工具。單元測試提供了應用程式符合軟體規範並按預期運行的基本驗證。 喝咖啡休息#87。 為什麼單元測試對開發人員很重要? 在 Java 中複製數組的 5 種方法 - 1如果做得好,單元測試:
  • 減少缺陷數量並在開發生命週期的早期階段識別它們;
  • 提高程式碼可讀性;
  • 允許程式碼重用;
  • 提高部署速度。
讓我們看看為什麼單元測試很重要,這種類型的測試是如何起源的,以及其實施的障礙是什麼。

單元測試的歷史

及早發現錯誤可以節省時間和精力。在電腦歷史的前 50 年中,單元測試和調試本質上是同一件事。但到了 20 世紀 90 年代,程式碼變得如此複雜,以至於通常不可能將系統分成小部分來單獨運行它們。1997 年,一位名叫 Kent Beck 的程式設計師創建了 JUnit,這是一個用於測試小程式碼片段的開發環境插件。評估原始程式碼的測試程式碼稱為單元測試。多年來,這種類型的單元測試已成為主要內容。Beck 創建 JUnit 後,Martin Fowler 寫了一本書《重構》,其中他提出了轉換程式碼以使其更加隔離和可測試的方法。程式碼重構和單元測試的結合導致了測試驅動的開發,其中單元測試的創建對於程式設計過程至關重要。其中,程式碼甚至在創建之前就必須是可測試的。因此,直到運行單元測試後,編程過程才完成。然後該計畫可以進入系統或人類層面的研究階段。

單元測試範例

這個例子說明了單元測試的重要性。這裡 JUnit 評估一個將溫度從華氏溫度轉換為攝氏度的簡單函數。換算公式:C=(F-32)*5/9。只需幾行,包括函數簽名和花括號,就可以在程式碼中實作為庫函數。然而,從功能上並不清楚這些是標準。這些選項可能包括向上或向下捨去、實數或上限和下限。讓我們使用 Test::More 模組在 Perl 中為此溫度轉換函數建立範例單元測試。第一行是一條註釋,告訴程式設計師對其餘程式碼的期望。
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
JUnit 框架依賴於物件導向的系統和測試對象,但概念是相似的。

隔離單元測試

單元測試的好處之一是它們隔離函數、類別或方法並僅測試該程式碼段。更好的單一組件可提供整體系統的彈性。這樣你就可以獲得可靠的程式碼。單元測試也改變了調試過程的性質。為了嘗試修復錯誤,程式設計師只需編寫一個失敗的測試,然後重複它,以便它在不違反先前期望的情況下通過。此過程消除了透過設定、重新建立、暫停和測試進行的傳統調試的手動週期。要更改程式碼以使其適合單元測試,程式設計師必須改變他們的工作方式。任何未經單元測試編寫的程式碼都可能被視為未經測試,至少作為單獨的模組是如此。

調整單元測試

遺留軟體是已經運行了很長時間並且很可能是在沒有單元測試的情況下編寫的軟體。遺留代碼對公司有價值。它可以穩定工作多年。一些沒有進行單元測試的程式每天處理數百萬美元的交易。但隨著時間的推移,沒有單元測試的程式碼會變成一大堆污垢,因為多年來許多程式碼維護程式設計師都接觸過它。重構允許程式設計師逐步對系統進行更改以使其可測試。然而,這些改變需要時間。幾年前,我與同事 Bob Reselman 討論了對遺留應用程式使用單元測試的問題。Reselman 認為,在沒有它的應用程式中實施單元測試過於昂貴,甚至是愚蠢的。相反,他建議該組織透過單元測試開始新的開發,而不要理會遺留應用程式。對於 COBOL、報告產生器和其他應用程式來說可能是這樣,但我認為在用現代語言(C++、C#、Java 和 Ruby)編寫的應用程式中,追溯添加單元測試非常容易。無需為整個應用程式編寫它們,只需將單元測試新增至當前變更並隨時重構即可。

提高速度、品質和可測試性

專案經理表示,規劃涉及品質、已完成工作量、資源和時間之間的權衡。要為一個區域添加一些東西,您必須從另一個區域拿走一些東西。有效的單元測試打破了這個規則。這就是為什麼單元測試對組織來說是重要且有價值的。良好的單元測試會產生可提高品質的可測試程式碼。該程式碼的缺陷會更少,這意味著修復的錯誤更少,可以更快地完成專案。當軟體遇到錯誤時,單元測試可以加快偵錯、修復和編寫程式碼的速度。這種情況的發生方式使得缺陷再次發生的可能性顯著降低,同時提高了程式碼的品質和速度。雖然軟體開發中沒有靈丹妙藥,但有效的單元測試可以加快開發、測試甚至某些功能需求工程的速度。

在 Java 中複製數組的 5 種方法

來源:Dev.to 因此,您有兩個陣列 A 和 B,您需要將元素從 A 複製到 B。在 Java 中,有不同的方法可以做到這一點,我現在將向您展示它們。

方法一:For循環

這就是古老的for循環為我們提供幫助的地方:
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

方法二:.clone()

數組克隆方法也可以幫助達到預期的結果:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

方法三:System.arraycopy()

下一個方法是使用System.arraycopy()方法,該方法位於java.lang套件中。在我們繼續使用它之前,讓我們先討論一下它的簽名:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
應用:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

方法四:Arrays.copyOf()

我們將討論的下一個複製選項是java.utils套件中的Arrays類別。注意他的簽名:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
應用:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

方法五:Arrays.copyOfRange()

因此,這將是我們在本文中討論的最後一個選項。它也來自java.utils套件中的Arrays類別。我們再看一下他的簽名:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
應用:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION