测试步骤的数据驱动

1. 简介

了解了测试数据驱动测试用例,那么下一步我们来学习一下测试步骤的数据驱动。测试步骤的数据驱动就是将测试步骤(比如 find_element( )、click( )、send_keys( )等)封装到 YAML 文件中管理。当测试步骤发生改变,只需要修改 YAML 文件中的配置即可。

2. 数据驱动的意义

测试过程中使用数据驱动的优势主要体现在以下几点:

  1. 提高代码复用率,相同的测试逻辑只需编写一条测试用例,就可以被多条测试数据复用,提高了测试代码的复用率,同时提高了测试代码的编写效率。
  2. 异常排查效率高,测试框架依据测试数据,每条数据生成一条测试用例,用例执行过程相互隔离。如果其中一条失败,不会影响其他的测试用例。
  3. 代码可维护性高,清晰的测试框架利于其他测试工程师阅读,提高代码的可维护性。

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>

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务