テスト関数


作成したプログラムにテストを書いて、私はずっとこの習慣がなくて、いくつかの原因があります:1.基本ユニットのテストもできないので、書かないほうがいいでしょう.(触れてない!)2.接触した后、机械的に缲り返す感じがして、とても时间を浪费して、また书きたくありません.△これは間違った考えだ.
しかし、プログラマーが書いた文章をよく見て、自分の書いたコードにテストを書くのは、優れたプログラミング規範と習慣だと言っています.考えてみると、自分が優秀なプログラマーになることを励ますのは、テストコードを書くことを学ぶべきで、優秀な習慣だけでなく、自分のコードのエラー率をより低くし、より丈夫にすることができます.進歩するために、テストの書き方をマスターします.

1. unittest.TestCaseクラスでよく使われる断言方法


方法
用途
assertEqual(a, b)
確認a==b
assertNotEqual(a, b)
aを確認!=b
assertTrue(x)
xがTrueであることを確認
assertFalse(x)
xがFalseであることを確認
assertIn(item, list)
リスト内のitemの確認
assertNotIn(item, list)
itemがlistにないことを確認
断言方法は、あなたが満たすべき条件が満たされているかどうかをチェックするために使用されます.この条件が確かに満たされていれば、プログラムの動作に対する仮説が確認され、間違いがないと確信することができます.満たすべき条件が実際に満たされていないと思ったら、Pythonは異常を起こします.

2.関数の記述


2つのパラメータ:1つの都市名と1つの国名を受け入れる関数を作成します.この関数は、Beijing,ChinaのようなCity,Country形式の文字列を返します.
#  city_functions.py 

def city(city, country):
    """ """
    repo_city = city + ', ' + country
    return repo_city.title()

別のプログラムを作成しcity_をインポートfunctions.pyファイルのcity()関数.
#  city.py 

from city_functions import city

print('  q  :')
while True:
    city_name = input("
-> "
) if city_name == 'q': break country_name = input(" -> ") if country_name == 'q': break city_country = city(city_name, country_name) print('\t ' + city_country)

3.試験用例を書く


3.1まず、Python標準ライブラリのモジュールunittestが提供するコードテストツールについて説明します。

  • ユニットテスト
  • 試験例
  • 全カバー式試験例
  • 1.ユニットテストは、関数のある側面に問題がないことを確認するために使用されます.2.試験例は、関数の様々な状況における挙動が要求に合致していることを確認するユニット試験のセットである.良好なテスト例は、これらのすべての状況に対するテストを含む、関数が受信する可能性のある様々な入力を考慮している.3.フルオーバーライド型テストケースそれがテストケースの究極のバージョンです.様々な可能な関数の使用方法をカバーするユニットテストのセットが含まれています.大規模なプロジェクトでは、フルオーバーライドテストの使用例を実現するのは難しいです.(私にもわかりません)

    3.2テストを書き始めました

    #  test_city_function.py 
    
    from city_functions import city
    import unittest
    
    class TestCity(unittest.TestCase):
        """ city_functions.py"""
    
        def test_city_country_by_chinese(self):
            """ ' ,  ' """
            city_country = city(' ', ' ')
            self.assertEqual(city_country, ' ,  ')
    
    unittest.main()
  • まず、ここではモジュールunittestとテストする関数city()
  • とを導入する.
  • 次に、TestCityというクラスを作成します.クラス名は勝手につけることができますが、このテストの関数が多すぎると、どの関数をテストしているのかを簡単に知ることができるように、クラス名をつけるときは、テストする関数に関連するクラス名をできるだけ取り、Testの字様も含めます.このクラスはunittest.TestCaseクラスを継承しなければなりません.そうすれば、Pythonはあなたが作成したテストをどのように実行するかを知ることができます.
  • クラスでは、test_city_country_by_chineseという方法を記述し、中国語を入力する都市名と国名という面、すなわちユニットテストをテストする.このメソッドでは、test_の先頭に名前を付けます.test_city_function.pyが実行されると、test_の先頭にあるメソッドが自動的に実行されるからです.メソッド名も、テストする側面に関連する必要があります.もちろん強制的ではありませんが、このように命名するのは良い符号化習慣です.
  • この方法では、テストする関数city()を呼び出し、この関数の2つの実パラメータ‘ ’ ‘ ’を与える.テストする関数の戻り値を変数city_countryに格納します.
  • 次にunittestで最もよく使われる機能である断言方法を用いた.得られた結果が期待された結果と一致するかどうかを確認するために使用される.一致すれば万事順調で、一致しなければ異常を引き起こす.
  • unittest.main()このファイルのテストをPythonに実行させます.

  • このテストファイルtest_city_function.pyを実行します.結果を見てみましょう.
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    

    上の1行目の点.は、1つのテストが合格したことを示し、最後のOKは、このテスト例のすべてのユニットテストが合格したことを示している.
    この出力は,与えられた都市名と国家名,関数city()が常に正しく処理できることを示している.
    次に、英語を入力した場合の関数city()が正しく処理されるかどうか、すなわちフォーマットを見てみましょう.関数cityには都市名と国名の頭文字を大文字で返す機能があるので、中国語ではこのように処理できません.
    このクラスTestCityで別のユニットテストを記述します.
    #  test_city_function.py 
    
    def test_city_country_by_english(self):
        """ ‘Shenzhen, China’ """
        city_country = city('shenzhen', 'china')
        self.assertEqual(city_country, 'Shenzhen, China')

    結果:
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    
    okは、英語入力の場合、関数city()がそのフォーマットを正しく処理できることを示している.

    3.3合格できないテスト


    どちらも正常にテストに合格しましたが、実際のコードにはエラーが発生する可能性があります.プログラムに人口数を加えることができるもう一つの条件があると仮定します.現在のプログラムにはこの機能がないことを知っています.人口数を加えたときにエラーがどのように提示されるかをテストします.
    #  test_city_function.py 
    
    def test_city_country_population(self):
        """ ‘Shenzhen, China - population 20000000’ """
        city_country = city('Shenzhen', 'China', 20000000)
        self.assertEqual(city_country, 'Shenzhen, China - population 20000000')

    テストファイルを実行すると、次のようなエラーが表示されます.
    ..E
    ======================================================================
    ERROR: test_city_country_population (__main__.TestCity)
     ‘Shenzhen, China, 20000000’ 
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "test_city_function.py", line 21, in test_city_country_population
        city_country = city('Shenzhen', 'China', 20000000)
    TypeError: city() takes 2 positional arguments but 3 were given
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.001s
    
    FAILED (errors=1)
    

    最初の行では、..Eに2つの点と1つの文字Eが表示され、テーブル名の2つのユニットテストに合格し、3つ目は合格しなかった.次に、誤った情報ヒントを見てみましょう.方法test_city_country_population()で問題が発生したことがわかります.TypeErrorからヒント:city()takes 2 positional arguments but 3 were given、city()には2つのパラメータしかないことを知っていますが、3つの実パラメータを提供しました.
    ここで、テストコード自体に問題がなければ、テストが合格しなかったら、テストを修正するのではなく、テストが合格できないコードを修正する必要があります.city_function.pyファイルのコードを変更します
    しかし,誤りの原因は1つのパラメータが欠けているためであることが分かったが,パラメータを追加する際に前の2つのテストが合格できないため,3番目のパラメータの解決策はこのパラメータをオプションにすることである.
    コードを変更します.
    def city(city, country, population=''):
        """ """
        if population:
            repo_population = ' - population ' + population
            repo_city = city + ', ' + country
            return repo_city.title() + repo_population
        else:
            repo_city = city + ', ' + country
            return repo_city.title()

    テストファイルを実行します.
    ...
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
    

    結果から,我々が修正したコードは,2つのパラメータ入力のテストに影響を及ぼさず,人口数を追加するテストにも満足した.
    これはテスト関数に関するブログで、テストクラスも重要です.また今度書きます.