Python | Hypothesisを使用してPythonコードをすばやくテストする

前書き

使用するプログラミング言語やフレームワークに関係なく、テストは非常に重要です。 HypothesisはPython用の高度なテストライブラリです。これにより、テストケースを作成するときにパラメータ化が可能になり、テストを失敗させる単純で理解しやすいテストデータが生成されます。少ない作業で、コード内により多くのバグを見つけることができます。テストライブラリはほとんどの状況をカバーしており、実際にコード内のエラーを見つけるのに役立ちます。

この記事では、 Hypothesisを使用してPythonでテストする方法と、いくつかの例を示します。

**テストをどのように区別しますか? ****

属性ベースのテストを開始する前に、テストの一般的な違いを知る必要があります。さまざまなグループテスト方法があり、最も一般的な2つの方法は、テスト方法とテストレベルに基づいています。ほとんどの人がすでに聞いたことがあるテストレベルから始めましょう。基本的に、4つのテストレベルがあります(ただし、他のレベルを知っているか、定義している場合もあります)。

さまざまなテストレベルがさまざまなことに焦点を当てています。ユニットテストは、ソフトウェアの特定の部分または機能に焦点を当てています。これは、単一の関数または関数の一部にすることができます。代わりに、統合テストは、ソフトウェアコンポーネントのインターフェイスを介したコラボレーションに焦点を当てています。システムテストはさらに進んで、システム全体をテストできます。

次に、存在するさまざまなテスト方法を見ていきます。

最も一般的で既知のテストは、静的テストと動的テストです。いわゆる静的テストは、テスト対象のソフトウェアを実際に実行するのではなく、プログラムコード、インターフェイス、またはドキュメントでエラーの可能性を静的にチェックするプロセスです。ソフトウェアまたはその一部が実際に実行される場合、それを動的テストと呼びます。ユニットテストと統合テストの作成は動的テストです。

もう1つの一般的な方法は、ボックス方式です。基本的に、ホワイトボックステストとブラックボックステスト(および2つの混合としてのグレーボックステスト)に分けることができます。ホワイトボックステストでは、プログラムの内部構造または動作条件を確認できます。ブラックボックステストはその逆です。ブラックボックステストでは、アプリケーションはブラックボックスとして扱われ、その相互作用がテストされます。これは、内部実装を知らなくても機能をテストすることを意味します。

**属性ベースのテストとは何ですか? ****

テストを区別する方法がすぐに理解できたので、次のように質問することができます。属性ベースのテストとは何ですか。

プロパティベースのテストとは、コードに当てはまる論理ステートメント(つまり、「属性」)を記述し、自動化されたツールを使用してテスト入力(通常は特定の特定のタイプのランダムに生成された入力データ)、およびプログラムが入力を受け入れたときに属性が変更されないままであるかどうかを観察します。入力が属性に違反している場合、ユーザーはプログラムにエラーがあることを証明し、エラーを示す便利な例を見つけます。

属性ベースのテストには「仮説」を使用します

簡単な例を見てみましょう。 2つの関数 crement()decrement()があるとします。実装例は次のようになります。

# increment_decrement.py

def increment(number: int)-> int:return number +1

def decrement(number: int)-> int:return number -1

次のように、両方のユニットテストコードを記述できます。

# test_increment_decrement_pytest.py

from increment_decrement import decrement
from increment_decrement import increment

def test_increment():
 x =5
 expected =6
 actual =increment(x)
 assert actual == expected

def test_decrement():
 x =5
 expected =4
 actual =decrement(x)
 assert actual == expected

注:テストコードは、pytestフレームワークを使用して記述されています。

もちろん、より多くのテストスクリプトを記述して、値が異なる2つの関数をテストしたり、テストをパラメーター化することもできます。ただし、最終的には、事前定義された値を使用してこれら2つの関数をテストします。

属性ベースのテストライブラリ(仮説など)を使用してテストを作成することは異なります。ここでは、テストするタイプと、ソフトウェアの動作または動作を指定できます。次に、ライブラリは指定されたタイプに従ってランダムな値を生成し、実際のテスト機能を実行します。

Hypothesisを使用して2つの機能をテストする方法を見てみましょう。

# test_increment_decrement_hypothesis.py

from hypothesis import given
import hypothesis.strategies as st

from increment_decrement import decrement
from increment_decrement import increment

@ given(st.integers())
def test_increment(x):
 expected = x +1
 actual =increment(x)
 assert actual == expected

@ given(st.integers())
def test_decrement(x):
 expected = x -1
 actual =decrement(x)
 assert actual == expected

ご覧のとおり、両方のテストスクリプトにはパラメータ xがあります。 xの値は、integers()メソッドを使用して Hypothesisによって生成されます。 Hypothesisはさまざまな方法を提供します。基本的に、これらのメソッドは組み込みタイプまたはその他の構造に対応し、特定のタイプに一致するランダムデータを生成します。

いいですね。しかし、特定の値で関数をテストして、その値も使用できることを確認したい場合はどうでしょうか。 Hypothesis@example()デコレータを提供し、値を定義できます。値がランダムに生成されたテストデータセットに属していない場合でも、対応する関数に値を渡すことができます。

簡単な例を見てみましょう。

# div.py

def div(dividend: int, divisor: int)-> int:return dividend // divisor

除数と被除数を受け取り、2つの商を返す関数 div()を定義します。これらの2つのパラメーターは整数データであるため、結果も整数データになることに注意してください。Pythonの //演算子を使用して、整数除算を実行します。

div()関数をテストするために、新しいテストファイル test_div.pyを作成し、test_div()というテストスクリプトを作成しました。

# test_div.py

from hypothesis import example
from hypothesis import given
import hypothesis.strategies as st

from div import div

@ given(dividend=st.integers(), divisor=st.integers())
def test_div(dividend, divisor):if divisor ==0:
  expected =-1else:
  expected = dividend // divisor
 actual =div(dividend, divisor)
 assert actual == expected

同様に、「Hypothesis」の「integers()」メソッドを使用して、除数と被除数の値を生成します。私たちが書いたテストスクリプトは、実行時に Hypothesisによって生成される値に応じて、合格する場合と合格しない場合があります。値 0が常にdiv()関数に渡されるようにするには、@example(1、0)test_div()関数に追加します。したがって、ランダムに生成されたデータセットに div()が含まれていない場合でも、除算器 0の値で少なくとも1回呼び出されます。

テストスクリプトをそのまま実行すると、 test_div()は常に失敗します。したがって、この状況を処理してテストに合格するように div()関数を変更してみましょう。

# div.py

def div(dividend: int, divisor: int)-> int:if divisor ==0:return-1return dividend // divisor

概要

この記事では、主に属性ベースのテストとは何か、なぜそれが役立つのかについて説明します。また、属性ベースのテストを記述し、pytestテストで実行できる Hypothesisライブラリを簡単に確認しました。

Love&Share [終了]ちなみに、読んだ後は、4つの接続の1つの鍵を覚えておいてください。これは私にとって非常に重要です。

Recommended Posts

Python | Hypothesisを使用してPythonコードをすばやくテストする
グレーレベルの同時発生マトリックス(Pythonコードを使用)
CythonでPythonコードを高速化
PythonでダイナミックカラーQRコードを作成する
Pythonをすばやく開始する方法
ヘッダー付きのpythonrequests.get
Python(18)入門
Python(9)入門
PythonでWeChatを再生する
Python(4)入門
PythonによるWebスクレイピング
Python入門(2)
python-1入門
PythonSMS爆撃コード
Python(14)入門
Python(7)の使用を開始する
Python(17)入門
Python(15)入門
Python(10)入門
Python(11)入門
Python(6)入門
Python(3)入門
Python(12)入門
Python(5)入門
Python入門(18歳以上)
Python(13)入門
Python(16)入門