python ddtデータ駆動テスト

3657 ワード

DDTは、データ駆動テストで、「Data-Driven Tests」の略です.
ddtテストの導入の必要性
データ駆動テストは、パラメータに従ってテスト方法を実装し、異なるシーンの使用例テストを実現することができる.コードのメンテナンスにおいても、実行効率においても、単一のテスト方法と比較して、テスト例が著しく向上する.
栗を挙げると、私は最近フィルタインタフェースを書いています.入参には3つの次元があり、各次元はそれぞれ4つ、3つ、4つあります.もし私が従来の方法で書くならば、1つのテスト方法は1つのシーンだけをテストして、私は4 x 3 x 4=48のテスト方法を書く必要があります.明らかに、パラメータの違いだけで、同じ方法で48回書く必要があり、時間を無駄にします.ddtデータ駆動を導入すれば、パラメータを組み合わせて入力する方法で、48のテスト例をすぐに完了することができます.
ddt使用方法
pythonのunittestにはデータ駆動機能が付いていません.unittestを使用し、同時にデータドライバを使用したい場合は、DDTを使用して完了できます.ddtはサードパーティモジュールで、ddtを使用するには先にインストールし、pip install ddtを使用してインストールを完了する必要があります.
DDTは、TestCaseサブクラス用のクラスアクセラレータddtと、テストクラス@data()を修飾する2つのメソッドアクセラレータ:@ddt:テストクラスを修飾する::テストに提供する値と同じ数のパラメータを含む.通常、各値dataは単一のパラメータとしてテストメソッドに渡されます.@unpackは、伝達されたパラメータが複雑なデータ構造である場合に使用される.たとえば、メタグループまたはリストを使用してunpackを追加すると、メタグループとリストが自動的に複数のパラメータに解凍され、辞書が複数のキーワードパラメータに解凍されます.@file_data():JSONまたはYAMLファイルからテストデータがロードされます.「.yml」と「.yaml」で終わるファイルのみがYAMLファイルとしてロードされます.その他のファイルはすべてJSONファイルとしてロードされます.
コードの例
  import unittest
  from ddt import ddt, data, unpack, file_data     


 @ddt     #       
 class LearnDdt(unittest.TestCase):

@data([3, 2], [4, 3], [5, 3])                            #   data   ,      ,  unpack   
@unpack
def test_list_extracted_into_arguments(self, first_value, second_value):
    print(first_value, second_value)
    self.assertTrue(first_value > second_value)

@unpack
@data({'first': 1, 'second': 3, 'third': 2},              #   data              ,          
      {'first': 4, 'second': 6, 'third': 5})
def test_dicts_extracted_into_kwargs(self, first, second, third):
    print(first, second, third)
    self.assertTrue(first < third < second)

@data((3, 2), (4, 3), (5, 3))                              #   data          ,             
@unpack
def test_tuples_extracted_into_arguments(self, first_value, second_value):
    print(first_value, second_value)
    self.assertTrue(first_value > second_value)

@file_data("test_data_dict_dict.json")                      #   @file_data        - json  
def test_file_data_json_dict_dict(self, start, end, value):
    print(start, end, value)
    self.assertLess(start, end)
    self.assertLess(value, end)
    self.assertGreater(value, start)

@file_data('test_data_dict.json')                            #   @file_data      ,         
def test_file_data_json_dict(self, value):
    print(value)

@file_data('test_data_list.json')                              #   @file_data      ,          
def test_file_data_json_list(self, value):
    print(value)


if __name__ == "__main__":
       unittest.main()

リファレンスファイルパラメータ:ファイル1:test_data_dict.json
    {
"unsorted_list": [ 10, 12, 15 ],
"sorted_list": [ 15, 12, 50 ]
   }

ファイル2:test_data_dict_dict.json
   {
"positive_integer_range": {
    "start": 0,
    "end": 2,
    "value": 1
},
"negative_integer_range": {
    "start": -2,
    "end": 0,
    "value": -1
},
"positive_real_range": {
    "start": 0.0,
    "end": 1.0,
    "value": 0.5
},
"negative_real_range": {
    "start": -1.0,
    "end": 0.0,
    "value": -0.5
}
}

ファイル3:test_data_list.json
[
"Hello",
"Goodbye"
 ]

参照先:https://ddt.readthedocs.io/en/latest/example.html https://www.cnblogs.com/miniren/p/7099187.html
へへへ、この文章はあなたに役に立つと思って、あなたの爱する小さな手を伸ばして、赤い心をつけましょう(赤い心があるのを見て喜んで、ノートを書くことを堅持して助けがあることを説明します~)