「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > クリーンなコードを理解する: 単体テスト ⚡

クリーンなコードを理解する: 単体テスト ⚡

2024 年 8 月 31 日に公開
ブラウズ:456

Understanding Clean Code: Unit Tests ⚡

ソフトウェア開発において、単体テストはコードの正確性を確認するのに役立つ重要な実践です。

『Clean Code: A Handbook of Agile Software Craftsmanship』の第 9 章「単体テスト」では、クリーンで効果的な単体テストを作成するための原則と実践方法について詳しく説明しています。

この記事では、この章の重要なポイントを要約し、これらの概念を説明するために JavaScript の例を示します。


?単体テストが重要な理由

単体テストには、コードの個々のユニットまたはコンポーネントに対するテストを作成して、それらが期待どおりに機能することを確認することが含まれます。単体テストの主な目的は次のとおりです:

1- バグの早期検出: 開発中に問題が本番環境に到達する前に検出します。

2- リファクタリングの促進: コードへの変更によって既存の機能が損なわれないようにします。

3- コードの動作の文書化: コードの使用目的に関する文書として機能します。


?効果的な単体テストの原則

⚡ 一度に 1 つずつテストする

各単体テストは、機能の 1 つの側面に焦点を当てる必要があります。これにより、テストの理解と保守が容易になります。テストが失敗した場合、問題がどこにあるのかを正確に知ることができます。

function add(a, b) {
    return a   b;
}

// Test case for the add function
function testAdd() {
    // Test adding positive numbers
    assertEqual(add(2, 3), 5, '2   3 should be 5');
    // Test adding negative numbers
    assertEqual(add(-1, -1), -2, '-1   -1 should be -2');
}

// A simple assertion function
function assertEqual(actual, expected, message) {
    if (actual !== expected) {
        throw new Error(message);
    }
}

⚡ テストを読みやすくする

テストは読みやすく、理解しやすいものでなければなりません。テスト関数にはわかりやすい名前を使用し、アサーションを明確にします。これにより、他の人 (そしてあなた自身) が各テストで何を検証しているのかをすぐに把握することができます。

function isEven(number) {
    return number % 2 === 0;
}

// Descriptive test function
function testIsEven() {
    assertEqual(isEven(4), true, '4 should be even');
    assertEqual(isEven(5), false, '5 should be odd');
}

⚡ 明確でわかりやすい名前を使用してください

テスト ケースの名前は、テストの内容を説明する必要があります。これにより、テストの可読性と保守性が向上します。

function calculateTotalPrice(items) {
    return items.reduce((total, item) => total   item.price, 0);
}

// Descriptive test case names
function testCalculateTotalPrice() {
    assertEqual(calculateTotalPrice([{ price: 10 }, { price: 20 }]), 30, 'Total price should be 30 for items costing 10 and 20');
    assertEqual(calculateTotalPrice([{ price: 5 }]), 5, 'Total price should be 5 for a single item costing 5');
}

⚡ テストを独立した状態に保つ

各テストは他のテストから独立している必要があります。共有状態に依存するテストは、不安定なテストにつながり、デバッグを困難にする可能性があります。

function multiply(a, b) {
    return a * b;
}

// Independent test cases
function testMultiply() {
    assertEqual(multiply(2, 3), 6, '2 * 3 should be 6');
    assertEqual(multiply(0, 10), 0, '0 * 10 should be 0');
}

⚡ モックとスタブを適切に使用する

モックとスタブは、依存関係をシミュレートすることにより、テスト対象のコード単位を分離するのに役立ちます。ただし、テストが複雑になりすぎないよう慎重に使用してください。

// Example of using a mock for a database call
function getUser(id) {
    // Imagine this function makes a database call
    return database.getUserById(id);
}

function testGetUser() {
    const mockDatabase = {
        getUserById: (id) => ({ id, name: 'John Doe' }),
    };

    const result = getUser(1, mockDatabase);
    assertEqual(result.name, 'John Doe', 'User name should be John Doe');
}

⚡ テストを自動化する

単体テストの実行を自動化し、定期的に実行されるようにします。継続的インテグレーション (CI) ツールは、変更が加えられるたびにテストを自動的に実行するのに役立ちます。

Jest のようなテスト フレームワークを使用している場合は、package.json でスクリプトを設定できます:

"scripts": {
    "test": "jest"
}

npm テストを実行すると、すべてのテストが実行され、そのステータスに関するフィードバックが提供されます。


結論

高品質なコードを維持するには、クリーンで効果的な単体テストを作成することが不可欠です。

クリーン コードの第 9 章で概説されている原則に従うことで、テストが信頼性が高く、理解しやすく、価値のあるものであることを保証できます。

これらのプラクティスを JavaScript コードに実装すると、テストの品質が向上するだけでなく、より堅牢で保守しやすいコードベースにも貢献します。

ハッピーコーディング!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/alisamir/ Understanding-clean-code-unit-tests-5d1a?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3