本文共 5016 字,大约阅读时间需要 16 分钟。
数据驱动模式(Data-Driven Testing, DDT)是一种灵活且高效的测试方法,它通过将测试数据外部化,避免了在测试脚本中硬编码具体的测试数据,从而提高了测试脚本的复用性和维护效率。在本文中,我们将使用Python的ddt库,结合unittest框架,来构建一个基于百度搜索的数据驱动测试案例。
数据驱动测试的核心优势在于其灵活性和可扩展性。通过将测试数据外部化,测试脚本可以与多种不同的数据集协同工作,从而支持更复杂的测试场景。与传统的固定数据测试相比,数据驱动测试能够显著降低测试脚本的编写和维护成本。
ddt库的数据驱动测试为了实现数据驱动测试,我们需要使用ddt库。ddt提供了一系列装饰器和工具,用于将测试数据参数化。以下是ddt的基本使用方法:
安装ddt库:使用pip命令安装ddt库:
pip install ddt
创建测试类:使用@ddt装饰器标记测试类,表示这是一个数据驱动测试类。
参数化测试方法:在测试方法上使用@data装饰器,接收测试数据。@unpack装饰器用于将数据元组或列表解析为多个参数。
以下是一个简单的百度搜索测试案例,使用ddt实现数据驱动:
import unittestfrom selenium import webdriverfrom ddt import ddt, data, unpack@ddtclass SearchDDT(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") @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) 除了内置数据,ddt还支持从外部文件(如CSV、Excel等)加载测试数据。以下是一个使用CSV文件的示例:
import csvimport unittestfrom selenium import webdriverfrom ddt import ddt, data, unpackdef get_data(file_name): rows = [] with open(file_name, 'r') as data_file: reader = csv.reader(data_file) next(reader, None) # 跳过标题行 for row in reader: rows.append(list(row)) return rows@ddtclass SearchCSVDDT(unittest.TestCase): '''百度搜索数据驱动测试(使用CSV文件)''' def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") @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) 与CSV文件类似,ddt也支持从Excel文件中加载数据。以下是一个使用Excel的示例:
import xlrdimport unittestfrom ddt import ddt, data, unpackdef get_data(file_name): book = xlrd.open_workbook(file_name) sheet = book.sheet_by_index(0) rows = [] for row_idx in range(1, sheet.nrows): rows.append(list(sheet.row_values(row_idx, 0, sheet.ncols))) return rows@ddtclass SearchEXCELDDT(unittest.TestCase): '''百度搜索数据驱动测试(使用Excel文件)''' def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") @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) 如果需要从数据库中加载测试数据,可以通过编写一个获取数据的函数来实现。以下是一个简单的数据库驱动测试示例:
import unittestfrom selenium import webdriverfrom ddt import ddt, data, unpackimport sqlite3def get_data(db_file): conn = sqlite3.connect(db_file) c = conn.cursor() c.execute("SELECT keyword, expected_result FROM test_data") rows = c.fetchall() conn.close() return rows@ddtclass SearchDBDDT(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") @data(*get_data('test.db')) @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) 通过本文的示例,可以看到ddt库为数据驱动测试提供了强大的支持。无论是内置数据、CSV文件、Excel文件,还是数据库,ddt都能够轻松地加载和处理测试数据,从而实现高效的测试执行。这种模式不仅提高了测试脚本的复用性,还可以显著降低测试维护成本。如果需要进一步了解数据驱动测试的实现细节和更多用例,可以参考相关技术文档和实践案例。
转载地址:http://agofk.baihongyu.com/