引言
前面已经和大家介绍过 Unittest 测试框架的数据驱动框架 DDT,以及其实现原理。今天和大家分享的是 Pytest 测试框架的数据驱动,Pytest 测试框架的数据驱动是由 pytest 自带的pytest.mark.parametrize()来实现的。
pytest.mark.parametrize 实现数据驱动
pytest.mark.parametrize 是 pytest 的内置装饰器,它允许你在 function 或者 class 上定义多组参数和 fixture 来实现数据驱动。
@pytest.mark.parametrize() 装饰器接收两个参数:
第一个参数以字符串的形式存在,它代表能被被测试函数所能接受的参数,如果被测试函数有多个参数,则以逗号分隔;
第二个参数用于保存测试数据。如果只有一组数据,以列表的形式存在,如果有多组数据,以列表嵌套元组的形式存在(例如:[1,1]或者[(1,1), (2,2)])。
针对装饰器的单参数和多参数,分别举例如下。
1.pytest.mark.parametrize 单参数
# test_singal.py
import pytest
@pytest.mark.parametrize("number", [1, 0])
def test_equal(number):
assert number == 1
if __name__ == "__main__":
pytest.main([])
以上是单参数的一个例子,在这个例子中,test_equal 函数接收一个参数 number,这个参数有两组数据,分别是 1 和 0。
tips:
装饰器 pytest.mark.parametrize 的第一个参数里的参数名称必须与测试函数中的参数称保持一致。
即:test_equal这个函数方法的参数 number 必须与装饰器里的第一个参数的名称 number 保持一致。
运行以上代码,结果如下图所示:
可以看到,函数 test_equal 提供了两组参数 1 和 0,所以它也执行了 2 次。
2.pytest.mark.parametrize 多参数
pytest.mark.parametrize 不仅支持单个参数,也可以支持多个参数,多个参数比较常见,因为在日常工作中,我们提供测试数据,不仅仅包括用于测试的数据,还包括用于验证的数据,所以多参数还是比较常见的。
pytest.mark.parametrize 可以支持多参数,举例如下:
# test_baidu.py
import time
import pytest
from selenium import webdriver
@pytest.mark.baidu
class TestBaidu:
def setup_method(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
@pytest.mark.parametrize('search_string, expect_string', [('Testing', 'Testing'), ('helloworld.com', 'Testing')])
def test_baidu_search(self, search_string, expect_string):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").send_keys(search_string)
driver.find_element_by_id("su").click()
time.sleep(2)
search_results = driver.find_element_by_xpath('//*[@id="1"]/h3/a').get_attribute('innerHTML')
assert (expect_string in search_results) is True
def teardown_method(self):
self.driver.quit()
if __name__ == "__main__":
pytest.main(["-m", "baidu", "-s", "-v", "-k", "test_baidu_search", "test_baidu.py"])
上面这段代码,被测试函数 test_baidu_search 有两个参数,分别是 search_string 和 expect_string。那么对应着,在 pytest.mark.parametrize 这个装饰器的第一个参数里,也包含 search_string 和 expect_string。
在命令行中运行结果如下:
pytest.fixture 扩展数据驱动
做过自动化测试的小伙伴,应该都很清楚地知道,无论 API 还是 UI 的自动化测试可以总结为三个步骤:
测试前的准备 —> 执行测试 —> 测试后的清理。