JavaRush /Java Blog /Random-JA /コーヒーブレイク #87。開発者にとって単体テストが重要なのはなぜですか? Java で配列をコピーする 5 つの...

コーヒーブレイク #87。開発者にとって単体テストが重要なのはなぜですか? Java で配列をコピーする 5 つの方法

Random-JA グループに公開済み

開発者にとって単体テストが重要なのはなぜですか?

出典: SearchSoftwareQuality 単体テストがなぜ重要で価値があるのか​​、また単体テストによってデバッグがどのように容易になるのかについて説明します。単体テストは、ソフトウェアの品質を向上させるための強力なツールです。単体テストは、アプリケーションがソフトウェア仕様に準拠しており、意図したとおりに動作するかどうかの基本的な検証を行います。 コーヒーブレイク #87。 開発者にとって単体テストが重要なのはなぜですか?  Java で配列をコピーする 5 つの方法 - 1単体テストがうまく完了すると、次のことが行われます。
  • 欠陥の数を減らし、開発ライフサイクルの初期段階で欠陥を特定します。
  • コードの可読性を向上させます。
  • コードの再利用を許可します。
  • 導入速度を向上させます。
単体テストがなぜ重要なのか、このタイプのテストがどのように始まったのか、そしてその実装の障壁は何なのかを見てみましょう。

単体テストの歴史

初期段階でエラーが検出されると、時間と労力が節約されます。コンピューターの歴史の最初の 50 年間、単体テストとデバッグは本質的に同じものでした。しかし、1990 年代までにコードは非常に複雑になり、システムを小さな部分に分割して個別に実行することが不可能になることがよくありました。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 フレームワークはオブジェクト指向システムとテスト オブジェクトに依存していますが、概念は似ています。

分離された単体テスト

単体テストの利点の 1 つは、関数、クラス、またはメソッドを分離し、そのコード部分のみをテストできることです。個々のコンポーネントの向上により、システム全体の復元力が向上します。こうすることで、信頼性の高いコードが得られます。単体テストでは、デバッグ プロセスの性質も変わります。バグを修正しようとする場合、プログラマは単に失敗するテストを作成し、それを繰り返して、事前の期待に違反することなく合格するようにします。このプロセスにより、セットアップ、再作成、一時停止、テストによる従来のデバッグの手動サイクルが不要になります。コードを単体テストに適したものに変更するには、プログラマーの作業方法を変更する必要があります。単体テストなしで書かれたコードは、少なくとも個々のモジュールとしてはテストされていないとみなされます。

単体テストの適応

レガシー ソフトウェアとは、長期間実行されており、単体テストなしで作成された可能性が高いソフトウェアです。レガシーコードは企業にとって価値があります。長年にわたって安定して動作します。単体テストなしで構築されたプログラムの中には、1 日に数百万ドルのトランザクションを処理するものもあります。しかし、単体テストのないコードは、長年にわたって多くのコード保守プログラマーによって触られてきたため、時間の経過とともに大きな土の塊となります。リファクタリングを使用すると、プログラマはシステムに徐々に変更を加えてテスト可能にすることができます。ただし、これらの変化には時間がかかります。数年前、私は同僚の Bob Reselman とレガシー アプリケーションの単体テストの使用の問題について話し合いました。リセルマン氏は、単体テストを行わずに構築されたアプリケーションに単体テストを実装するのはコストがかかりすぎ、愚かですらあると主張した。代わりに、組織が単体テストから新しい開発を開始し、レガシー アプリケーションはそのままにしておくようにと彼は推奨しました。これは COBOL、レポート ジェネレーター、その他のアプリケーションに当てはまるかもしれませんが、最新の言語 (C++、C#、Java、Ruby) で書かれたアプリケーションでは、単体テストを遡って追加するのは非常に簡単だと私は主張します。アプリケーション全体に対してテストを記述するのではなく、現在の変更に単体テストを追加し、作業を進めながらリファクタリングします。

速度、品質、テスト容易性の向上

プロジェクト マネージャーは、計画には品質、完了した作業量、リソース、時間の間のトレードオフが関係していると述べています。ある領域に何かを追加するには、別の領域から何かを取り除く必要があります。効果的な単体テストはこのルールを破ります。これが、単体テストが組織にとって重要で価値がある理由です。優れた単体テストでは、品質を向上させるテスト可能なコードが生成されます。このコードには欠陥が少なくなり、プロジェクトをより早く完了するためのバグ修正が少なくなります。ソフトウェアでバグが発生した場合、単体テストによってデバッグ、修正、コードの作成が高速化されます。これは、欠陥が再発する可能性が大幅に低下すると同時に、コードの品質と速度が向上する形で実現されます。ソフトウェア開発に特効薬はありませんが、効果的な単体テストにより、開発、テスト、さらには機能要件エンジニアリングの一部さえもスピードアップできます。

Java で配列をコピーする 5 つの方法

出典: Dev.to つまり、2 つの配列 A と B があり、要素を A から B にコピーする必要があります。Java でこれを行うにはさまざまな方法があるので、これから説明します。

方法 1: ForLoop

ここで古き良きforループが役に立ちます。
int[] A = {1,2,4,4};
int[] B = new int[];

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

方法 2: .clone()

アレイのクローン作成方法も、望ましい結果を達成するのに役立ちます。
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

方法 3: System.arraycopy()

次の方法は、java.langパッケージに含まれるSystem.arraycopy()メソッドを使用する方法です。使用に進む前に、その署名について説明しましょう。
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);

方法 4: 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);

方法 5: 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