JavaRush /Java 博客 /Random-ZH /喝咖啡休息#87。为什么单元测试对开发人员很重要?在 Java 中复制数组的 5 种方法

喝咖啡休息#87。为什么单元测试对开发人员很重要?在 Java 中复制数组的 5 种方法

已在 Random-ZH 群组中发布

为什么单元测试对开发人员很重要?

来源: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