ユニットテストの種類

19913 ワード


導入
あなたの銀行口座をチェックしてください.500ドルです.ウェブサイトは一晩更新されます、そして、あなたは朝再びチェックします.あなたの残高は367.43ドルです.あなたのお金はどこに行ったのですか.それは本当にあなたのバランスですか?
カスタマーサービスに報告します.他のユーザーの何千人も同様の問題を報告します.顧客のアカウントを閉じます.
銀行のソフトウェアエラーが原因であることがわかります.銀行の開発者は、ユーザーにそれを展開する前に、ソフトウェアでテストを実行しませんでした.お金が消えることはなかったが、金額はウェブサイトに誤って印刷された.
ソフトウェアのエラーは避けられない.チェックされていない、これらのエラーは、ユーザーと開発者に苦痛と高価な影響を与えることができます.2002年に、米国商務省の国立標準技術研究所によって委託された研究は、ソフトウェアエラーが米国経済に年間約59億ドルを要したと結論付けました.
それらのコストを避けるために、ソフトウェア専門家は自動化されたテストを使用します.生産の間、そして、生産の後、彼らは彼らの製品がエラーがなくて、予想通りに働くという彼ら自身自信を与えるために自動化されたテスト・スイートを走らせることができます.
我々が行くことは、これらの概念を議論する知識と実践です.このレッスンの終わりまでには、次のようになります.
  • は自動テストスイート
  • を定義します
  • は、テストスイートがソフトウェア開発
  • で使われる方法を記述する
  • は自動化されたテスト
  • の利点を説明する

    マニュアルテスト
    ソフトウェアテストは、コンピュータソフトウェアの完全性と品質を評価するプロセスです.通常、これはシステムの一部を実行することによって行われます.
    ソフトウェアテストを行う一つの方法は手動テストです.手動テストは、システムとの人間の相互作用によって行われるテストの形式です.Webアプリでは、これはクリックして、ドラッグして、ウェブページを入力する可能性があります.行動と予想される振舞いのリストは、与えられます.観測された動作が予想される振舞いと一致しない場合、アプリケーションにエラーが発生します.
    エラーは、提供されたWebアプリケーションで発見したかもしれないもののように、バグとも呼ばれます.バグは、予期しない方法でシステムを動作させるソフトウェアのエラー、欠点、または欠陥です.あなたが最後の運動で読んだように、これらの予期しない動作は、ユーザーに害を与える可能性があります.理想的なテストは、ユーザーに送信される前にバグをキャッチします.

    自動テスト
    どのくらい前に手動で、以前の運動でアプリケーションをテストするためにかかりましたか?あなたが100回のプロセスを繰り返した場合、どのように頻繁にあなたは間違いを犯すと思いますか?
    会社では、誰かがその仕事をするために支払わなければならないので、マニュアルテストのあらゆる時間はコストを持っています.試験のコストを低減でき,自動試験により品質を改善できる.
    自動テストは、テストの実行を制御するためのソフトウェアを使用し、実際の行動の予想された動作を比較します.あなたがちょうどした(そして、より多くの)すべてのテストは、コンピュータプログラムによって実行されることができました.
    手動テストと比較して、自動テストは
    より速く
  • :それはより少ない時間であなたの製品の詳細をテストします.
  • より信頼性:人間よりも誤差が少ない.
  • メンテナンス可能:テストのコレクションを確認、編集、拡張できます.
  • 開発の終わりにテストチームを雇うよりも、プロの開発者はすべての変更後に自動テストを実行することができます.ワークフローは次のようになります.
    書き込みコードと対応するテスト
  • は、テスト
  • を走らせるために、端末にコマンドを入力します
  • アプリが意図通りに動作する場合、すべてのテストを通過する必要があります.開発は完了です.
  • それが意図通りふるまいませんならば、少なくとも1つのテストは失敗しなければなりません.コードを修正し、手順2に戻ります.

  • テストスイート
    テストは、あなたのWebアプリの残りの部分と同じように、コードで書かれています.アプリケーションを定義するコードを実装コードとして、テストコードをテストコードとして定義するコードを参照できます.
    Webアプリケーションのテストのコレクションをテストスイートと呼びます.前回の演習では、NPMテストでテストスイートを実行しました.その場合、テストスイートには、アプリケーションのすべてのテストが含まれています.
    テストコードは実装コードと同様に含まれて構成されます.しばしば、コードをテストするための変更は、実装コードとその逆の変更に関連付けられます.両方が同じ場所に格納されているときに維持する方が簡単です.
    たとえば、実装コードがインデックスに書き込まれている場合.その後、対応するテストコードをインデックステストに書き込むことができます.js
    const {assert} = require('chai');
    
    describe('User visits index', () => {
      describe('to post an order', () => {
        /*
         * Run `npm start` in the terminal and reload the page. Expect the webpage to be visible and the order form to be empty.
         */
        // Edit the line below
        it('starts with a blank order (Behavior 1)', () => {
          browser.url('/');
    
          assert.equal(browser.getText('#deliver-to span'), '');
          assert.equal(browser.getText('#cake-type span'), '');
          assert.equal(browser.getText('#fillings span'), '');
          assert.equal(browser.getText('#size span'), '');
        });
    
        /*
         * Type a name and click "Place Order". Expect "Deliver to:" to display the submitted name. (You may need to scroll down.)
         */
        it('displays the submitted name (Behavior 2)', () => {
          const name = 'Hungry Person';
    
          browser.url('/');
          browser.setValue('#name', name);
          browser.click('#submit-order');
          browser.url('/');
    
          assert.include(browser.getText('#deliver-to'), name);
        });
    
        it('does not overwrite name if blank name submitted (Behavior 3)', () => {
          const name = 'Hungry Person';
    
          browser.url('/');
          browser.setValue('#name', name);
          browser.click('#submit-order');
          browser.url('/');
          browser.click('#submit-order');
          browser.url('/');
    
          assert.include(browser.getText('#deliver-to'), name);
        });
    
        /*
         * Select a cake type and place the order. Expect "Cake" to display the selected type.
         */
        it('displays the selected cake type (Behavior 4)', () => {
          const cakeType = 'Whole Wheat';
    
          browser.url('/');
          browser.click('#whole-wheat');
          browser.click('#submit-order');
          browser.url('/');
    
          assert.include(browser.getText('#cake-type'), cakeType);
        });
    
        /*
         * Check some fillings. Expect "Fillings" to display your selection.
         */
        it('displays multiple fillings (Behavior 5)', () => {
          const firstChoice = 'Strawberries';
          const secondChoice = 'Banana';
    
          browser.url('/');
          browser.click('#strawberries');
          browser.click('#banana');
          browser.click('#submit-order');
          browser.url('/');
    
          assert.include(browser.getText('#fillings'), firstChoice);
          assert.include(browser.getText('#fillings'), secondChoice);
        });
    
        /*
         * Choose a stack size. Expect "Pancake Count:" to display the number equivalent to the stack size, e.g. "Double" is "2".
         */
        it('displays the number equivalent to the stack size (Behavior 6)', () => {
          const optionText = 'Septuple Stack';
          const optionNum = '7';
    
          browser.url('/');
          browser.selectByVisibleText('#select-stack', optionText)
          browser.click('#submit-order');
          browser.url('/');
    
          assert.include(browser.getText('#size'), optionNum);
        });
        });
    });
    

    ドキュメントとしてのテスト
    このケーキバーのアプリを誰かに説明を想像してください.どのように振る舞うのですか.それは他のソフトウェアに依存しますか?どのように、あなたはコンピュータでそれを走らせますか?あなたはそれを把握するすべてのファイル内のすべての行を読むことができます.または、ドキュメントを読むことができました.
    ドキュメントは、どのように動作するか、それを使用するかを説明する実装コードとは別の内容です.これは、実装コードよりも簡潔な要約と説明を提供することができます.
    ドキュメントは、プレーンテキスト、ダイアグラム、およびテストを含む多くの形式で来ることができます!ドキュメントとしてのテストでは、他の多くの形式を指定できません.
    ケーキバーアプリケーションからこのコードブロックを記述し、“名前”機能をテストします.
    it('accepts the customer name', () => {
      const name = 'Hungry Person';
    
      browser.url('/');
      browser.setValue('#name', name);
      browser.click('#submit-order');
      browser.url('/');
    
      assert.include(browser.getText('#deliver-to'), name);
    });