ホームページ >ウェブフロントエンド >jsチュートリアル >機能的なJavaScriptのテストに関する初心者ガイド
キーポイント
機能的なプログラミングとテスト。あなたはそれらを別々に試したかもしれませんが、どういうわけかあなたはあなたの定期的な練習に両方を組み込むことはありません。単純に聞こえるかもしれませんが、テストと機能的なプログラミングは、より明確で、よりコンパクトで、より保守可能なコードを書くことを強制する魅力的な誘惑を作成する可能性があります。
良いニュースは、両方のテクノロジーを同時に使用することで、いくつかの実用的な利点が提供されることです。実際、この組み合わせの甘さを経験したら、あなたは私のように中毒になるかもしれません。
「純粋なコードを書くことは機能的なJavaScriptの原則に従う」コースをご覧ください。コードを分割し、維持しやすくします...なぜですか?この記事でこのコースをご覧ください。機能的JavaScriptのテストの原則を紹介します。ジャスミンフレームワークを使用し、テスト駆動型の方法を使用して純粋な機能を構築する方法を紹介します。
なぜそれをテストするのですか?
テストは、アプリケーション内のコードが予想どおりに実行され、変更を行ったときに予想どおりに実行され続けることを確認することで、作業を終了したときに利用可能な製品を入手することができます。定義された一連の状況で予想される機能を定義するテストを作成し、コードに対してテストを実行すると、結果がテストが示すものと一致しない場合は警告が表示されます。そして、コードを修正するまで、その警告を受け続けます。それからあなたは報酬を得るでしょう。
はい、これは気分が良くなります。
テストには多くの種類があり、境界が分割されている場所について議論する余地がたくさんありますが、要するに:
エンコードプロセス中はいつでもテストを作成できますが、テストを計画する機能を作成する前に、ユニットテストを作成するのが常に最も効果的です。テスト駆動型開発(TDD)として知られるこのプラクティスは、書き込みを開始する前にアプリケーションの機能を分解し、コードの各部分から必要な結果を決定し、最初にテストを書き、次にコードを書き込むことを奨励します。その結果を生成するため。
片側の利点は、TDDがしばしば、あなたが書いているプログラムが実際に探しているプログラムであることを確認するためにプログラムを書くためにあなたに支払う人々と詳細な議論をすることを強制することです。結局のところ、単一のテストを渡すのは簡単です。難しさは、遭遇する可能性のあるすべての可能な入力を処理するかどうかを判断し、何も壊すことなくすべての入力を正しく処理することです。
なぜ機能的なプログラミングを選択するのですか?
想像できるように、コードを書く方法は、テストの難しさと密接に関連しています。ある関数の動作を別の関数にしっかりと結合したり、グローバル変数に大きく依存したりするなど、一部のコードパターンにより、コードの単体テストがより困難になります。場合によっては、テスト可能なパラメーターと結果を確立するために、外部データベースの動作を「シミュレート」したり、複雑なランタイム環境をシミュレートするなどの不便な手法を使用する必要がある場合があります。これらのケースは常に回避可能ではありませんが、コードの残りの部分をより簡単にテストできるように、コードのこれらのケースが必要な場所を分離することがよくあります。機能的なプログラミングを使用すると、アプリケーションのデータと動作を個別に処理できます。独立して機能し、外部状態に依存しない個別の関数セットを作成することにより、アプリケーションを構築できます。その結果、コードはほぼ自己文書化されたコードになり、一貫して動作し、理解しやすい小さな明確に定義された機能を組み合わせます。
機能プログラミングは、通常、命令的なプログラミングとオブジェクト指向プログラミングとは対照的です。 JavaScriptは、これらすべてのテクノロジーをサポートし、それらを混合することもできます。機能プログラミングは、結果が返されるまでアプリケーションの状態を追跡する命令的なコードシーケンスを作成するためのもう1つの貴重な代替手段として機能します。または、特定のデータ構造に適用されるすべてのメソッドをカプセル化する複雑なオブジェクトを介した相互作用を通じてアプリケーションを構築します。
純粋な機能の作業方法機能的なプログラミングは、特定のことを1つだけ行い、毎回同じ入力に対して同じ値を返す、小さく、再利用可能な複合機能を使用してアプリケーションを構築することを奨励します。このような関数は純粋な関数と呼ばれます。純粋な機能は機能的なプログラミングの基礎であり、すべてに次の3つの特性があります。
機能コードをテストしやすくするのはなぜですか?
私たちが議論した概念を考慮すると、機能コードがテストしやすい理由を既に理解できます。純粋な機能のテストの作成は、各入力に一貫した出力があるため、非常に簡単です。期待値を設定し、コードに対して実行するだけです。コンテキストを確立する必要はなく、関数間の依存関係を追跡する必要も、関数の外側の変更状態をシミュレートする必要も、変数の外部データソースをシミュレートする必要もありません。完全なフレームワークからユーティリティライブラリや簡単なテストツールまで、多くのテストオプションがあります。これらには、ジャスミン、モカ、酵素、Jest、その他多くのツールが含まれます。各ツールには、長所と短所、最高のユースケース、忠実なフォローがあります。 Jasmineは、さまざまな状況で使用できる強力なフレームワークです。そのため、ブラウザでJasmineとTDDを使用して純粋な機能を開発する方法を簡単に説明します。
ローカルまたはCDNからジャスミンテストライブラリを抽出するHTMLドキュメントを作成できます。ジャスミンライブラリとテストランナーを含むページの例は、次のようになるかもしれません:
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>これは、ジャスミンライブラリ、およびジャスミンHTMLブートスクリプトとスタイルを紹介します。この場合、ドキュメントの本文は空で、JavaScriptがテストされ、ジャスミンテストがテストされるのを待っています。
機能的JavaScriptのテスト - 最初のテスト
最初に、最初のテストを書きましょう。これを別のドキュメントで行うか、ページ上の要素に含めることでこれを行うことができます。 Jasmineライブラリによって定義された<script></script>
関数を使用して、まだ書いていない新しい機能の望ましい動作を説明します。 describe
と呼ばれ、渡された文字列が前後に同じ場合、isPalindrome
に戻り、そうでなければtrue
に戻ります。テストは次のようになります:false
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); });</code>これをページのスクリプトに追加してブラウザにロードすると、エラーを示すJasmineレポートページが表示されます。これが私たちがこの瞬間に望むものです。テストが実行されているかどうか、そしてそれが失敗したかどうかを知りたいです。このように、認識されたいと思っている私たちの脳は、私たちが何かを修正する必要があることを知っています。
javaScriptに単純な関数を書いてみましょう。ここでは、テストを実行するのに十分なロジックしかありません。この場合、それは期待値を返すことにより、テストの1つを渡すだけの関数です。
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>
はい、本当に。私はそれがばかげているように見えることを知っていますが、それに固執してください。
テスト実行プログラムを再度実行すると、合格します。確かに。しかし、明らかに、この単純なコードは、Palindromeテストプログラムに対する私たちの期待を満たしていません。今必要なのは、余分な期待です。それでは、私たちのdescribe
関数に別のアサーションを追加しましょう:
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); });</code>
ページをリロードすると、テスト出力が赤くなり、失敗します。問題が何であるかを示すメッセージを受け取り、テスト結果が赤くなりました。
赤!
私たちの脳は何かが間違っていると感じています。
もちろん、問題があります。今、私たちの単純なisPalindrome
関数は毎回true
のみを返し、この新しいテストを効果的にターゲットにすることができないことが証明されています。それでは、isPalindrome
を更新し、着信文字列の前後に関数を比較する機能を追加しましょう。
<code class="language-javascript">const isPalindrome = (str) => true;</code>
テストは中毒性があります
もう一度緑になります。これは満足です。あなたがページをリロードするとき、あなたはその小さなドーパミンのサージを得ますか?
これらの変更により、テストは再び合格します。私たちの新しいコードは、文字列の前後を効果的に比較し、true
を返します。 false
この一貫性がこの機能の単体テストがどれほど簡単になるかを見ることができます。実際、テスト駆動型のコードを作成すると、テストと変更が容易であるため、純粋な関数を書くことができます。
そして、あなたはテストに合格することに満足したいです。私はあなたがそうすることを知っています。
純粋な関数の再構築 この時点で、他の関数を追加するのは非常に簡単です(非弦の入力の処理、上記の文字と小文字の違いなど)。プロダクトオーナーにプログラムの実行方法を尋ねてください。文字列が一貫して処理されることを確認するためのテストが既にあるため、エラーチェックまたは文字列のキャスト、または弦楽を非弦の値に好む動作を追加できるようになりました。
たとえば、番号1001のテストを追加した場合に何が起こるかを見てみましょう。
これを行うと、画面が再び赤くなり、現在の関数が非ストリング入力を処理する方法がわからないため、テストが失敗します。
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); it("returns false if the string isn't a palindrome", () => { expect(isPalindrome("Bubba")).toEqual(false); }); });</code>パニックが始まりました。赤が見えます。テストに失敗しました。
しかし、今度は安全に更新して、非弦の入力を処理し、文字列にキャストしてからチェックすることができます。このように見える関数を思いつくかもしれません:
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>
すべてのテストに合格したので、緑の甘いドーパミンがテスト駆動型の脳に注がれているのが見えます。
評価チェーンにtoString()
を追加することにより、テスト前に非弦の入力に適応して文字列に変換することができます。何よりも、他のテストは毎回実行されるため、この新しい機能を純粋な機能に追加することで、以前に取得した機能を破っていないことを確認できます。最終結果は次のとおりです
このテストを試して、ジャスミンまたはあなたに合ったその他のテストライブラリを使用して、独自のテストの書き込みを開始します。
コードデザインワークフローにテストを組み込み、ユニットテストのための純粋な機能の書き始めたら、過去の人生に戻るのが難しいかもしれません。しかし、あなたはそれをしたくないでしょう。
(この記事はVildan Softicによって査読されました。すべてのSitePoint Peer Revenyersに感謝します。
機能的なJavaScriptテスト(FAQ)に関する
functional JavaScriptテストは、コードのさまざまな部分(関数など)の関数をチェックして、予想どおりに機能することを確認するテストです。これには、異なる入力を使用して関数を通話するテストケースを作成し、出力を予想される結果と比較することが含まれます。これはソフトウェア開発の重要な部分であり、開発プロセスのエラーをできるだけ早く検出し、コードの品質と信頼性を保証します。
JavaScriptのRegexpテスト方法は何ですか?
を返します。この方法は、ユーザーの入力を検証したり、文字列のパターンを検索する必要がある場合に特に役立ちます。
javascriptでregexpテスト方法を使用するには、最初に一致するパターンを使用してregexpオブジェクトを作成する必要があります。次に、このオブジェクトのテスト方法を呼び出し、パラメーターとしてテストする文字列を渡します。一致が見つかった場合、メソッドはtrue
、そうでない場合はfalse
を返します。
機能テストと単体テストはどちらもテストプロセスの重要なコンポーネントですが、その目的は異なります。ユニットテストでは、テストコードのさまざまな部分(関数や方法など)の分離と、システムの残りの部分から分離することに焦点を当てています。一方、機能テストでは、システムの機能の大きなチャンク(モジュールやアプリケーション全体など)をテストして、統合されたときに期待どおりに機能するようにします。
JavaScriptの機能テストの良い実践は何ですか?
JavaScriptで機能テストをデバッグする方法は?
console.log
JavaScriptの機能テストにおける一般的な課題は何ですか?
JavaScriptで機能テストをさらに学習する方法は? async/await
以上が機能的なJavaScriptのテストに関する初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。