テスト関数
作成したプログラムにテストを書いて、私はずっとこの習慣がなくて、いくつかの原因があります:1.基本ユニットのテストもできないので、書かないほうがいいでしょう.(触れてない!)2.接触した后、机械的に缲り返す感じがして、とても时间を浪费して、また书きたくありません.△これは間違った考えだ.
しかし、プログラマーが書いた文章をよく見て、自分の書いたコードにテストを書くのは、優れたプログラミング規範と習慣だと言っています.考えてみると、自分が優秀なプログラマーになることを励ますのは、テストコードを書くことを学ぶべきで、優秀な習慣だけでなく、自分のコードのエラー率をより低くし、より丈夫にすることができます.進歩するために、テストの書き方をマスターします.
方法
用途
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つのパラメータ:1つの都市名と1つの国名を受け入れる関数を作成します.この関数は、Beijing,ChinaのようなCity,Country形式の文字列を返します.
別のプログラムを作成しcity_をインポートfunctions.pyファイルの
ユニットテスト 試験例 全カバー式試験例 1.ユニットテストは、関数のある側面に問題がないことを確認するために使用されます.2.試験例は、関数の様々な状況における挙動が要求に合致していることを確認するユニット試験のセットである.良好なテスト例は、これらのすべての状況に対するテストを含む、関数が受信する可能性のある様々な入力を考慮している.3.フルオーバーライド型テストケースそれがテストケースの究極のバージョンです.様々な可能な関数の使用方法をカバーするユニットテストのセットが含まれています.大規模なプロジェクトでは、フルオーバーライドテストの使用例を実現するのは難しいです.(私にもわかりません)
まず、ここではモジュール とを導入する.次に、TestCityというクラスを作成します.クラス名は勝手につけることができますが、このテストの関数が多すぎると、どの関数をテストしているのかを簡単に知ることができるように、クラス名をつけるときは、テストする関数に関連するクラス名をできるだけ取り、Testの字様も含めます.このクラスは クラスでは、 この方法では、テストする関数 次にunittestで最もよく使われる機能である断言方法を用いた.得られた結果が期待された結果と一致するかどうかを確認するために使用される.一致すれば万事順調で、一致しなければ異常を引き起こす.
このテストファイル
上の1行目の点
この出力は,与えられた都市名と国家名,関数
次に、英語を入力した場合の関数
このクラス
結果:
どちらも正常にテストに合格しましたが、実際のコードにはエラーが発生する可能性があります.プログラムに人口数を加えることができるもう一つの条件があると仮定します.現在のプログラムにはこの機能がないことを知っています.人口数を加えたときにエラーがどのように提示されるかをテストします.
テストファイルを実行すると、次のようなエラーが表示されます.
最初の行では、
ここで、テストコード自体に問題がなければ、テストが合格しなかったら、テストを修正するのではなく、テストが合格できないコードを修正する必要があります.
しかし,誤りの原因は1つのパラメータが欠けているためであることが分かったが,パラメータを追加する際に前の2つのテストが合格できないため,3番目のパラメータの解決策はこのパラメータをオプションにすることである.
コードを変更します.
テストファイルを実行します.
結果から,我々が修正したコードは,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が提供するコードテストツールについて説明します。
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()
unittest.TestCase
クラスを継承しなければなりません.そうすれば、Pythonはあなたが作成したテストをどのように実行するかを知ることができます.test_city_country_by_chinese
という方法を記述し、中国語を入力する都市名と国名という面、すなわちユニットテストをテストする.このメソッドでは、test_
の先頭に名前を付けます.test_city_function.py
が実行されると、test_
の先頭にあるメソッドが自動的に実行されるからです.メソッド名も、テストする側面に関連する必要があります.もちろん強制的ではありませんが、このように命名するのは良い符号化習慣です.city()
を呼び出し、この関数の2つの実パラメータ‘ ’ ‘ ’
を与える.テストする関数の戻り値を変数city_country
に格納します.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つのパラメータ入力のテストに影響を及ぼさず,人口数を追加するテストにも満足した.
これはテスト関数に関するブログで、テストクラスも重要です.また今度書きます.