测试步骤的数据驱动
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>