当前位置:  首页>> 技术小册>> Selenium自动化测试实战

章节:使用xlrd模块读取Excel文件,使用pytest参数化实现DDT

在自动化测试领域,数据驱动测试(Data-Driven Testing, DDT)是一种强大的测试策略,它允许测试脚本从外部数据源(如Excel文件、CSV文件或数据库)读取测试数据和预期结果,从而减少了代码的重复性,提高了测试的灵活性和可维护性。本章节将详细介绍如何结合Python的xlrd库来读取Excel文件中的数据,并利用pytest框架的参数化功能实现数据驱动测试。

一、引言

在Selenium自动化测试中,经常需要对不同的输入数据进行测试以验证应用的功能性。手动为每个测试场景编写测试脚本既耗时又容易出错。采用DDT策略,可以显著提升测试效率,使测试更加系统化和可管理。Excel文件因其格式直观、编辑方便,成为存储测试数据的常见选择。

二、环境准备

在开始之前,请确保你的测试环境中已经安装了以下必要的库:

  • pytest:Python的第三方测试框架,支持简单的单元测试和复杂的集成测试。
  • xlrd:用于读取Excel文件的Python库(注意:xlrd从2.0版本开始不再支持.xlsx格式,仅支持旧的.xls格式。若需处理.xlsx文件,可考虑使用openpyxl库)。

可以使用pip命令安装这些库(以openpyxl为例,用于处理.xlsx文件):

  1. pip install pytest openpyxl

三、使用openpyxl读取Excel文件

由于xlrd的限制,这里我们将使用openpyxl来演示如何读取.xlsx格式的Excel文件。假设我们有一个名为testdata.xlsx的Excel文件,其中包含多个测试用例的数据。

  1. from openpyxl import load_workbook
  2. def read_excel_data(file_path, sheet_name='Sheet1'):
  3. """
  4. 读取Excel文件中的数据
  5. :param file_path: Excel文件的路径
  6. :param sheet_name: 工作表名称
  7. :return: 数据列表,每个元素是一个包含测试用例数据的元组
  8. """
  9. workbook = load_workbook(filename=file_path)
  10. sheet = workbook[sheet_name]
  11. data = []
  12. for row in sheet.iter_rows(min_row=2, max_col=sheet.max_column, values_only=True):
  13. # 假设第一行是表头,从第二行开始读取数据
  14. data.append(row)
  15. return data

四、使用pytest参数化

pytest提供了强大的参数化功能,允许我们为测试函数提供多组参数,并自动运行测试函数多次,每次使用不同的参数组合。

假设testdata.xlsx中的数据结构如下:

TestID URL ExpectedTitle
1 http://example.com Example Domain
2 http://google.com Google

我们可以编写一个参数化的测试用例来验证网页的标题是否正确。

  1. import pytest
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. # 假设这是从Excel读取的函数(这里用静态数据模拟)
  7. testdata = [
  8. (1, 'http://example.com', 'Example Domain'),
  9. (2, 'http://google.com', 'Google')
  10. ]
  11. @pytest.mark.parametrize("test_id, url, expected_title", testdata)
  12. def test_webpage_title(test_id, url, expected_title):
  13. """
  14. 测试网页标题是否正确
  15. """
  16. driver = webdriver.Chrome() # 假设使用Chrome浏览器
  17. try:
  18. driver.get(url)
  19. WebDriverWait(driver, 10).until(
  20. EC.title_contains(expected_title)
  21. )
  22. assert driver.title == expected_title, f"Expected title '{expected_title}' but got '{driver.title}'"
  23. finally:
  24. driver.quit()

五、整合Excel读取与pytest参数化

将读取Excel文件的功能与pytest的参数化功能结合起来,我们可以编写一个更完整的测试脚本。

  1. import pytest
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from openpyxl import load_workbook
  7. def read_test_data(file_path):
  8. """
  9. 读取Excel文件中的测试数据
  10. """
  11. workbook = load_workbook(filename=file_path)
  12. sheet = workbook.active
  13. data = []
  14. for row in sheet.iter_rows(min_row=2, values_only=True):
  15. data.append(row)
  16. return data
  17. # 假设Excel文件路径
  18. file_path = 'testdata.xlsx'
  19. testdata = read_test_data(file_path)
  20. @pytest.mark.parametrize("test_id, url, expected_title", testdata)
  21. def test_webpage_titles(test_id, url, expected_title):
  22. """
  23. 测试多个网页的标题是否正确
  24. """
  25. driver = webdriver.Chrome()
  26. try:
  27. driver.get(url)
  28. WebDriverWait(driver, 10).until(
  29. EC.title_contains(expected_title)
  30. )
  31. assert driver.title == expected_title, f"Test ID {test_id}: Expected title '{expected_title}' but got '{driver.title}'"
  32. finally:
  33. driver.quit()

六、总结

通过结合openpyxl读取Excel文件和pytest的参数化功能,我们成功地实现了一个基于数据驱动的Selenium自动化测试脚本。这种方法不仅提高了测试的效率,还使得测试数据的维护和管理变得更加容易。未来,随着测试需求的增加,只需在Excel文件中添加新的测试用例数据,而无需修改测试脚本代码,即可实现对新功能的测试覆盖。