データ駆動型モードテストの利点は、通常モードテストと比較して明らかです。データ駆動型モデルを使用すると、ビジネスに応じてテストデータを分解できます。変数を定義し、外部データまたはカスタムデータを使用してパラメーター化するだけでよいため、前のテストスクリプトでの固定データの使用を回避できます。テストスクリプトはテストデータから分離できるため、テストスクリプトはさまざまなデータセットで高度に再利用できます。複雑な条件のテスト範囲を拡大できるだけでなく、テストスクリプトの作成とメンテナンスを大幅に削減できます。
以下は、Pythonのデータ駆動モード(ddt)ライブラリをunittestライブラリと組み合わせて使用し、データ駆動モードでバイドゥ検索テストを作成します。
ddtライブラリには、データ駆動型テストを実装するためのクラスとメソッドのセットが含まれています。テスト内の変数はパラメーター化できます。
pythonに付属のpipコマンドを使用してダウンロードしてインストールできます:pip install ddt。ddtの詳細については、以下を参照してください。
単純なデータ駆動型テスト
データ駆動型テストを作成するには、テストクラスで@ddtデコレーターを使用し、テストメソッドで@dataデコレーターを使用する必要があります。@dataデコレータは、パラメータをテストデータとして扱います。パラメータには、単一の値、リスト、タプル、および辞書を使用できます。リストの場合は、@ unpackデコレーターを使用して、タプルとリストを解析して複数のパラメーターにする必要があります。
以下は、Baidu検索テストを実装し、検索キーワードと期待される結果を入力するためのもので、コードは次のとおりです。
import unittest
from selenium import webdriver
from ddt import ddt, data, unpack
@ddt
class SearchDDT(unittest.TestCase):
'''docstring for SearchDDT'''
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
# specify test data using @data decorator
@data(('python', 'PyPI'))
@unpack
def test_search(self, search_value, expected_result):
search_text = self.driver.find_element_by_id('kw')
search_text.clear()
search_text.send_keys(search_value)
search_button = self.driver.find_element_by_id('su')
search_button.click()
tag = self.driver.find_element_by_link_text("PyPI").text
self.assertEqual(expected_result, tag)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
test_search()メソッドでは、2つのパラメーターsearch_valueとexpected_resultを使用して、タプル解析済みデータを受信します。スクリプトが実行されると、ddtはテストデータを有効なpython識別子に変換し、より意味のあるテストメソッド名を生成します。結果は次のとおりです。
外部データを使用したデータ駆動型テスト
テキストファイル、スプレッドシート、データベースなど、必要なテストデータがすでに外部に存在する場合は、ddtを使用してデータを直接取得し、テストのためにテストメソッドに渡すこともできます。
以下は、外部CSV(カンマ区切り値)ファイルとEXCLEテーブルデータを使用してddtを実装します。
CSV経由でデータを取得する
上記のように、@ dataデコレーターは、(以前のテストデータの代わりに)解析された外部CSV(testdata.csv)をテストデータとして使用します。データは次のとおりです。
次に、最初にパス(ここでは現在のパスがデフォルトで使用されます)とCSVファイル名を含むget_data()メソッドを作成します。CSVライブラリを呼び出してファイルを読み取り、データの行を返します。次に、@ ddtと@dataを使用して、外部データ駆動型テストBaidu検索を実装します。コードは次のとおりです。
import csv, unittest
from selenium import webdriver
from ddt import ddt, data, unpack
def get_data(file_name):
# create an empty list to store rows
rows = []
# open the CSV file
data_file = open(file_name, "r")
# create a CSV Reader from CSV file
reader = csv.reader(data_file)
# skip the headers
next(reader, None)
# add rows from reader to list
for row in reader:
rows.append(row)
return rows
@ddt
class SearchCSVDDT(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
# get test data from specified csv file by using the get_data funcion
@data(*get_data('testdata.csv'))
@unpack
def test_search(self, search_value, expected_result):
search_text = self.driver.find_element_by_id('kw')
search_text.clear()
search_text.send_keys(search_value)
search_button = self.driver.find_element_by_id('su')
search_button.click()
tag = self.driver.find_element_by_link_text("PyPI").text
self.assertEqual(expected_result, tag)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
テストが実行されると、@ dataはget_data()メソッドを呼び出して外部データファイルを読み取り、@ dataに1行ずつデータを返します。実装の結果も上記と同じ
です。ソフトウェアテスト、インターフェーステスト、自動テスト、インタビューの経験を交換した場合。興味がある場合は、ソフトウェアテスト通信(1085991341)を追加できます。同僚との技術交流があります。
Excelからデータを取得する
Excleは、テスト中にテストデータを格納するためによく使用されます。上記のように、@ dataデコレータは、外部CSV(testdata.csv)をテストデータとして(以前のテストデータの代わりに)解析するためにも使用できます。データは次のとおりです。
次に、最初にパス(ここでは現在のパスがデフォルトで使用されます)とEXCELファイル名を含むget_data()メソッドを作成する必要があります。xlrdライブラリを呼び出してファイルを読み取り、データを返します。次に、@ ddtと@dataを使用して、外部データ駆動型テストBaidu検索を実装します。コードは次のとおりです。
import xlrd, unittest
from selenium import webdriver
from ddt import ddt, data, unpack
def get_data(file_name):
# create an empty list to store rows
rows = []
# open the CSV file
book = xlrd.open_workbook(file_name)
# get the frist sheet
sheet = book.sheet_by_index(0)
# iterate through the sheet and get data from rows in list
for row_idx in range(1, sheet.nrows): #iterate 1 to maxrows
rows.append(list(sheet.row_values(row_idx, 0, sheet.ncols)))
return rows
@ddt
class SearchEXCLEDDT(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
# get test data from specified excle spreadsheet by using the get_data funcion
@data(*get_data('TestData.xlsx'))
@unpack
def test_search(self, search_value, expected_result):
search_text = self.driver.find_element_by_id('kw')
search_text.clear()
search_text.send_keys(search_value)
search_button = self.driver.find_element_by_id('su')
search_button.click()
tag = self.driver.find_element_by_link_text("PyPI").text
self.assertEqual(expected_result, tag)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
上記のCVSファイルと同様に、テストが実行されると、@ dataはget_data()メソッドを呼び出して外部データファイルを読み取り、@ dataに1行ずつデータを返します。実行結果は上記と同じです〜
データベースのデータベーステーブルからデータを取得する場合は、get_data()メソッドも必要です。また、DB関連のライブラリを使用してデータベースに接続し、SQLクエリを実行してテストデータを取得します。
以上が本記事の全内容ですので、皆様の研究にお役立ていただければ幸いです。助けられた友達は好きでコメントすることができます。