博客
关于我
Python+Selenium之数据驱动测试的实现
阅读量:796 次
发布时间:2023-03-08

本文共 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)

    使用Excel文件

    与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/

    你可能感兴趣的文章