测试步骤的数据驱动
1. 简介
了解了测试数据驱动测试用例,那么下一步我们来学习一下测试步骤的数据驱动。测试步骤的数据驱动就是将测试步骤(比如 find_element( )、click( )、send_keys( )等)封装到 YAML 文件中管理。当测试步骤发生改变,只需要修改 YAML 文件中的配置即可。
2. 数据驱动的意义
测试过程中使用数据驱动的优势主要体现在以下几点:
- 提高代码复用率,相同的测试逻辑只需编写一条测试用例,就可以被多条测试数据复用,提高了测试代码的复用率,同时提高了测试代码的编写效率。
- 异常排查效率高,测试框架依据测试数据,每条数据生成一条测试用例,用例执行过程相互隔离。如果其中一条失败,不会影响其他的测试用例。
- 代码可维护性高,清晰的测试框架利于其他测试工程师阅读,提高代码的可维护性。
3. 测试步骤的数据驱动
首先对测试步骤进行封装,创建一个 steps.yaml 文件,代码如下:
- by: id locator: tv_search action: click
上面的代码定义了一个点击元素的事件,这个元素通过 id=‘tv_search’ 来定位,定位到这个元素之后执行 click( ) 方法。下面在 base_page.py 文件中定义 steps( ) 方法,代码如下:
省略...
def steps(self, path):
with open(path) as f:
steps: list[dict] = yaml.safe_load(f)
element: WebElement = None
for step in steps:
logging.info(step)
if "by" in step.keys():
element = self.find(step["by"], step["locator"])
if "action" in step.keys():
action = step["action"]
if action == "find":
pass
elif action == "click":
element.click()
省略... 创建一个测试类 testcase/test_dd.py ,在测试用例里获取上面定义的测试步骤,代码如下:
from test_appium.page.app import App
from test_appium.page.base_page import BasePage
class TestDD:
def test_dd(self):
base = BasePage()
base.steps("../page/steps.yaml")
def test_search(self):
App().start().main().goto_search_page().search("jd") 上面的代码base.steps("../page/steps.yaml")会读取 steps.yaml 文件中的测试步骤。运行 test_dd( ) 用例会完成查找 id=‘tv_search’ 元素并完成点击操作。
4. 测试步骤的数据驱动实战案例
首先对测试步骤进行封装,创建一个 search.yaml 文件,代码如下:
- by: id
locator: search_input_text
- action: send
value: "{key}"
- by: id
locator: name
action: click 上面的代码中定义了三个步骤,第一步通过 id=‘search_input_text’ 定位到这个元素。第二步会对上面定位到的元素输入,输入的内容是一个变量,可以在代码里对这个变量赋值。第三步完成对 id='name' 元素的点击操作。
在 base_page.py 文件中完善steps()方法,对 search.yaml 文件中测试步骤的实现解析:
import yaml
from appium.webdriver import WebElement
from appium.webdriver.webdriver import WebDriver
from selenium.webdriver.common.by import By
import logging
class BasePage:
省略...
_params={} #创建一个字典用于存储传入的参数
省略...
def __init__(self, driver: WebDriver = None):
self._driver = driver
def steps(self, path):
with open(path) as f:
steps: list[dict] = yaml.safe_load(f)
element: WebElement = None
for step in steps:
logging.info(step)
if "by" in step.keys():
element = self.find(step["by"], step["locator"])
if "action" in step.keys():
action = step["action"]
if action == "find":
pass
elif action == "click":
element.click()
elif action == "text":
element.text
elif action == "attribute":
element.get_attribute(step["value"])
elif action in ["send", "input"]:
content: str=step["value"]
for key in self._params.keys():
content=content.replace(\
"{%s}" %key, self._params[key])
element.send_keys(content) 在 base_page.py 文件中添加一个类变量_params={},用来存储传入的数据参数。 在 steps( ) 方法里面添加了新的处理elif action in ["send", "input"]:这一段代码,用来处理输入的文本来替换 Yaml 文件中的{key}的内容。
在测试用例 search.py 文件中改写成读取 search.yaml 中步骤,代码如下:
from test_appium.page.base_page import BasePage
class Search(BasePage):
# 多平台、多版本、多个可能定位符
_name_locator = (MobileBy.ID, "name")
def search(self, key: str):
# self.find(MobileBy.ID, "search_input_text").send_keys(key)
# self.find(self._name_locator).click()
self._params={}
self._params["key"]=key
self.steps("../page/search.yaml")
return self
首先将传入的搜索值变量赋值给 base_page.py 中的 _param 类变量,然后使用 steps( ) 方法解析../page/search.yaml路径下的 YAML 文件,完成测试步骤的执行。
小结
以上,我们顺利实现了测试数据以及测试步骤的参数化驱动。接下来,我们进一步了解在测试工作中常见的自动化异常处理机制。
<p> 专刊包含了10+年经验测试架构师对测试职业发展的深度解读 帮助你掌握当下 BAT 流行的 App 自动化测试技术基础技能和工具使用;以及从入门到进阶的自动化测试实战经验,在面试中能够脱颖而出。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p> <p> <br /> </p>
