自動化ユニットテスト-what and why?

4997 ワード

学習サイト:Improve Your Python:Understanding Unit Testing
  • 自動化ユニットテストとは何ですか?1.まずテストとは何ですか.

  • "Testing", in general programming terms, is the practice of writing code (separate from your actual application code) that invokes the code it tests to help determine if there are any errors.
    2.テストはコードが正しいことを保証することができず、テストに合格した例を言うしかない.自動化テストと手動テスト:テストコードが自動的にテストを実行する過程は自動化テストであり、手動でプログラムを実行し、インタラクティブに行うテストは手動テストである.4.テスト中にそれらのエラーを検出できますか?文法エラー、論理エラー....5.ユニットテストユニットとは、モジュール全体、クラス、関数、またはそれらの混合などであってもよいコード単位を指し、ユニットが最も重要なのは、テストされていないコードと区別されることを指す.次のコードは質量数を求めて、is_primeある数が質数かどうかを判断するprint_next_primeはパラメータnumberに最も近い次の素数を導出し,2つはそれぞれ2つのユニットである.後者は前者を呼び出し,前者は先にテストOKしてから後者をテストするからである.
    def is_prime(number):
        """Return True if *number* is prime."""
        for element in range(number):
            if number % element == 0:
                return False
    
        return True
    
    def print_next_prime(number):
        """Print the closest prime number larger than *number*."""
        index = number
        while True:
            index += 1
            if is_prime(index):
                print(index)
    
  • テストユニットの例の下のコードは、pythonに組み込まれたテストユニットフレームワークを使用したテストケースが1つしかないテストユニットです.unittest.main()が呼び出されたとき、クラスからunittest.TestCaseで継承されたクラスでtestで始まるメソッドが呼び出され、その断言がチェックされます.
  • import unittest
    from primes import is_prime
    
    class PrimesTestCase(unittest.TestCase):
        """Tests for `primes.py`."""
    
        def test_is_five_prime(self):
            """Is five successfully determined to be prime?"""
            self.assertTrue(is_prime(5))
    
    if __name__ == '__main__':
        unittest.main()
    
    

    このテストケースを実行すると、次のエラーメッセージが表示されます.
    Error
    Traceback (most recent call last):
      File "D:\Python\MyPythonProject\test_primes\test_primes.py", line 9, in test_is_five_prime
        self.assertTrue(is_prime(5))
      File "D:\Python\MyPythonProject\test_primes\primes.py", line 6, in is_prime
        if number % element == 0:
    ZeroDivisionError: integer division or modulo by zero
    
  • なぜ自動テストが必要なのですか?1.テストは、コードが一定の条件で正常に動作することを保証します.2.コードの変更が現在の機能を破壊しないことを確認します.特に、コードを再構築する際に役立ちます.3.ユニットテストでは、コードを書くときに異常に注意します.4.良いテストはモジュール化、結合解除コードを必要とし、これらはすべて良好なコード設計である.
  • デバッグとテストを続行エラーレポートから異常が表示され、異常表示が0で除算されたため、除算の範囲を2から開始します.
  • for element in range(2, number):
    

    テストケースの再実行に成功
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    
    OK
    
    Process finished with exit code 0
    

    次に、4が質量数が正しいかどうかをテストし、断言にパラメータを追加し、断言が間違っている場合にこのメッセージを印刷することに注意します.
    def test_is_four_non_prime(self):
        """Is four correctly determined not to be prime?"""
        self.assertFalse(is_prime(4), msg='Four is not prime!')
    
  • 限界テスト2つの一般的な例をテストしました.次に、大きな数、負数、0、1と入力するなど、限界テストの例を考えてみましょう.次に、0のテスト例を書きました.
  •     def test_is_zero_not_prime(self):
            """Is zero correctly determined not to be prime?"""
            self.assertFalse(is_prime(0))
    

    結果はまた間違っていることを発見して、私達は0,1を排除するべきで、そこで再びis_primeは以下のように変更されました.
    def is_prime(number):
        if number in (0,1):
            return False
        
        """Return True if *number* is prime."""
        for element in range(2,number):
            if number % element == 0:
                return False
    
        return True
    

    負数をもう一度試してみますか?-1から-9までテストしました
    def test_negative_number(self):
        """Is a negative number correctly determined not to be prime?"""
        for index in range(-1, -10, -1):
            self.assertFalse(is_prime(index))
    

    しかし、このように私たちが間違っているときは、どの負数が間違っているのか分かりません.私たちは以下のバージョンに変更しました.
    def test_negative_number(self):
        """Is a negative number correctly determined not to be prime?"""
        for index in range(-1, -10, -1):
            self.assertFalse(is_prime(index), msg='{} should not be determined to be prime'.format(index))
    

    これらの印刷エラーの負の数は-1です.
    Testing started at 22:17 ...
    
    Failure
    Traceback (most recent call last):
      File "D:\Python\MyPythonProject\test_primes\test_primes.py", line 22, in test_negative_number
        self.assertFalse(is_prime(index), msg='{} should not be determined to be prime'.format(index))
    AssertionError: True is not false : -1 should not be determined to be prime
    

    元のコードを再修正
    def is_prime(number):
        if number <= 1:
            return False
        
        """Return True if *number* is prime."""
        for element in range(2,number):
            if number % element == 0:
                return False
    
        return True
    
  • には他にもサードパーティ製のテストフレームワークがありますが、unittestで行った拡張だけで、より詳細な情報が印刷されます.
  • より多くの学習test case organization,continuous integration,and test case management