APP-关键字驱动

这篇博客介绍了如何运用关键字驱动的方法进行App自动化测试。通过yaml文件定义测试步骤,结合NativePage类实现点击、输入等操作。测试用例中加载yaml文件内容,调用页面对象的方法执行相应的操作,如点击、输入、断言等,实现对App的自动化测试流程。

什么时关键字驱动就不详细介绍了,跟之前有介绍过,详细参考关键字驱动_晒不黑的黑煤球的博客-CSDN博客

一样的用法,只是把方法名称和查找元素的表达式修改一下,读取yaml的代码都不用修改,只需要把对应的驱动对象换成APP的即可,具体如下

yaml文件代码如下:

-
  # 点击我的柠檬
  action: click
  params:
    locator: ['xpath','//*[@resource-id="com.lemon.lemonban:id/navigation_my"]']
-
  # 点击我的头像
  action: click
  params:
    locator: ['id','com.lemon.lemonban:id/fragment_my_lemon_avatar_title']
-
  # 输入用户名
  action: type
  params:
    locator: ['id','com.lemon.lemonban:id/et_mobile']
    words: "18173179913"
-
  # 输入密码
  action: type
  params:
    locator: ['id','com.lemon.lemonban:id/et_password']
    words: "179913"
-
  # 点击登录
  action: click
  params:
    locator: ['id','com.lemon.lemonban:id/btn_login']
-
  # 断言
  action: assert_error_tips_equal
  params:
    locator: ['id','com.lemon.lemonban:id/fragment_my_lemon_avatar_title']
    expected: "雨泽"

native_page.py代码如下:

from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when


class MobileKey:
    ENTER = 66
    VOLUME_UP = 24
    VOLUME_DOWN = 25
    BACK = 4


class NativePage:
    def __init__(self, driver):
        self.driver = driver

    def find_el(self, locator):
        """查找元素"""
        return self.driver.find_element(*locator)

    def click(self, locator):
        """点击"""
        wait = WebDriverWait(self.driver, timeout=5)
        condition = when.element_to_be_clickable(locator)
        element = wait.until(condition)
        ActionChains(self.driver).click(element).perform()

    def type(self, locator, words):
        """输入"""
        el = self.driver.find_element(*locator)
        el.send_keys(words)

    def get_toast_text(self):
        """获取错误信息"""
        toast = self.driver.find_element('xpath', '//android.widget.Toast')
        return toast.text

    def get_avatar_title(self):
        """获取登录后的头像名称"""
        title = self.driver.find_element('id', 'com.lemon.lemonban:id/fragment_my_lemon_avatar_title')
        return title.text

    def assert_error_tips_equal(self, locator, expected):
        """断言某个错误信息等于"""
        el = self.driver.find_element(*locator)
        assert el.text == expected

    def assert_avatar_title_equal(self, locator, expected):
        """断言登录后头像等于"""
        el = self.driver.find_element(*locator)
        assert el.text == expected

    def width(self):
        """获取app的宽度"""
        return self.driver.get_window_size()['width']

    def height(self):
        """获取app的高度"""
        return self.driver.get_window_size()['height']

    def swipe_left(self):
        """从右往左滑动"""
        self.driver.swipe(start_x=self.width() * 0.9, end_x=self.width() * 0.1,
                          start_y=self.height() * 0.5, end_y=self.height() * 0.5)

    def swipe_right(self):
        """从左往右滑动"""
        self.driver.swipe(start_x=self.width() * 0.1, end_x=self.width() * 0.9,
                          start_y=self.height() * 0.5, end_y=self.height() * 0.5)

    def swipe_up(self):
        """从下往上滑动"""
        self.driver.swipe(start_x=self.width() * 0.5, end_x=self.width() * 0.5,
                          start_y=self.height() * 0.9, end_y=self.height() * 0.1)

    def swipe_down(self):
        """从上往下滑动"""
        self.driver.swipe(start_x=self.width() * 0.5, end_x=self.width() * 0.5,
                          start_y=self.height() * 0.1, end_y=self.height() * 0.9)

    def enter(self):
        """回车"""
        self.driver.press_keycode(MobileKey.ENTER)

    def volume_up(self):
        """音量加"""
        self.driver.press_keycode(MobileKey.VOLUME_UP)

    def volume_down(self):
        """音量减"""
        self.driver.press_keycode(MobileKey.VOLUME_DOWN)

    def back(self):
        """返回"""
        self.driver.press_keycode(MobileKey.BACK)

测试用例代码如下:

import yaml

from pages.native_page import NativePage


def test_login_keyword(app):
    """关键字驱动的测试函数"""
    # 1.读取yaml文件的内容,包含app页面操作和对应的测试数据
    # 2.需要一个页面对象NativePage,调用nativepage手机页面操作
    with open('login_keywords', encoding='utf-8') as f:
        stpes = yaml.safe_load(f)
    nativepage = NativePage(app)
    for step in stpes:
        method_name = step['action']
        method_params = step['params']
        # 通过方法名称获取方法
        method = getattr(nativepage, method_name)
        # 因为得到的params是字典,所以需要解包
        method(**method_params)

运行结果:

<think> 首先,用户的问题是关于Java中关键字驱动的相关内容。他们想了解Java关键字驱动的原理、应用及实现方法。我需要基于提供的引用内容来回答这个问题。 回顾引用内容: - 引用[1]:定义了关键字驱动自动化测试,包括其核心思想(脚本与数据分离、界面元素名与测试内部对象名分离等),并提到它在自动化测试框架中的优势。 - 引用[2]:提供了一个示例代码,展示了如何将参数从字符串转换为字典形式,用于关键字驱动测试的实现。这是Python代码,但用户询问Java,所以我需要调整为Java实现。 - 引用[3]:强调了关键字驱动自动化测试领域的广泛应用,包括接口、WEB、APP测试,并提到它是一种设计模式,类似于面向对象编程思维。 - 引用[4]:讨论了Java中的`native`关键字,但这似乎关键字驱动测试无关。引用[4]是关于JNI的,与主题不直接相关,我应该忽略它,除非有间接的联系。用户的问题是关于“Java关键字驱动”,但引用[4]是关于`native`关键字,这可能是个误解;用户可能意指关键字驱动在Java中的应用,而不是Java的关键字本身。 用户说:“我想了解Java中关键字驱动的相关内容”,所以焦点是Java语言下的关键字驱动测试框架。 系统指令要求: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 行内数学表达式用$...$,独立公式用$$...$$,但本问题可能不涉及数学表达式。 - 引用内容末尾添加引用标识如[^1]。 - 生成相关问题。 - 所有引用基于提供的引用,不能添加外部引用。 我的回答结构: 1. 逐步解释Java中关键字驱动的原理。 2. 描述其应用场景。 3. 提供实现方法,包括代码示例(如果需要)。 4. 最后生成相关问题。 关键点: - 原理:从引用[1][3],关键字驱动是一种自动化测试设计模式,它将测试逻辑分解为关键字(如操作对象、操作、值),实现脚本与数据分离等。 - 应用:主要用于自动化测试,如接口、WEB、APP测试(引用[3])。 - 实现方法:引用[2]展示了参数转换的Python代码;我需要适配到Java。例如,在Java中,如何实现类似的参数解析关键字映射。 在Java中实现关键字驱动测试框架: - 通常使用工具如Selenium with Java,结合Page Object Model或自定义关键字驱动框架。 - 核心思想:定义一个关键字库(如类方法),每个关键字对应一个操作。 - 数据文件(如Excel、CSV)存储测试用例,其中包含关键字参数。 - 解释器读取数据文件,调用相应的关键字方法。 基于引用[2],可以创建一个方法将字符串参数转换为Map。 Java代码示例: 假设有一个String参数如 "by=id;value=kw;txt=关键字驱动",我们需要解析成Map<String, String>。 在Java中: ```java import java.util.HashMap; import java.util.Map; public class KeywordUtils { public static Map<String, String> parseArguments(String input) { Map<String, String> params = new HashMap<>(); if (input != null && !input.isEmpty()) { String[] pairs = input.split(";"); for (String pair : pairs) { String[] keyValue = pair.split("=", 2); // Limit to 2 parts if (keyValue.length == 2) { params.put(keyValue[0], keyValue[1]); } } } return params; } } ``` 然后,在测试框架中,使用这个Map来调用关键字方法。 整个框架结构: - 关键字接口:定义操作如click, type等。 - 实现类:实现这些操作。 - 测试执行器:读取测试数据,调用关键字。 应用:提高测试的可维护性复用性;当UI变化时,只需更新关键字定义,而不是所有脚本[^1]。 生成相关问题: 基于主题,生成3个相关问题。 最后结尾添加引用标识。 </think> 以下是对Java中关键字驱动原理、应用及实现方法的详细解析。回答基于您提供的站内引用内容(引用[1]、[2]、[3]),确保内容真实可靠。关键字驱动是一种自动化测试设计模式,广泛应用于Java测试框架中,其核心思想是遵循面向对象编程原则,实现脚本与数据的分离、界面元素名与测试内部对象名分离、测试描述与具体实现细节分离[^1][^3]。以下我将逐步解释原理、应用实现方法。 ### 1. **关键字驱动的原理** 关键字驱动(Keyword-Driven)是一种自动化测试框架的核心设计模式,其原理基于数据驱动测试的改进。在Java中,它通过以下机制工作: - **三大核心关键字**: - **被操作对象(Item)**:如UI元素(按钮、输入框)或API端点。 - **操作(Operation)**:如点击(click)、输入(type)、验证(verify)等动作。 - **值(Value)**:操作所需的参数,例如输入文本或期望结果。 - **分离机制**: - 脚本与数据分离:测试逻辑存储在关键字库中,测试数据(如参数列表)存储在外部文件(如Excel、CSV)中。例如,一个测试用例可能定义为 `{"operation":"click", "item":"loginButton", "value":""}`。 - 界面名与内部对象名分离:UI元素ID映射到逻辑名称(如将HTML元素的`id="kw"`映射为`searchBox`),当UI变化时,只需更新映射表而非重写脚本[^1][^3]。 - **工作流程**: 1. **读取数据文件**:从外部文件加载测试用例(包含关键字序列)。 2. **解析关键字**:将关键字映射到Java实现的业务逻辑。 3. **执行操作**:调用对应的Java方法执行测试步骤。 4. **生成报告**:输出测试结果。 这种模式提升了测试的可维护性复用性,减少了对UI变化的敏感度[^1][^3]。 ### 2. **关键字驱动的应用** 在Java自动化测试中,关键字驱动主要用于以下场景: - **WEB测试**:基于Selenium的框架(如TestNG或JUnit),处理页面元素操作(例如登录流程:输入用户名、密码、点击提交)。 - **接口测试**:用于RESTful API测试,关键字如 `{"operation":"get", "item":"/api/user", "value":"id=1"}` 验证响应数据。 - **APP测试**:结合Appium,实现移动端自动化(如滑动、点击事件)。 - **优势**: - **高可维护性**:UI变更时,只需更新关键字定义的映射文件而非修改脚本[^1]。 - **降低技术门槛**:测试用例可由非开发人员编写(使用自然语言或简单数据文件)。 - **高效复用**:统一关键字库支持跨项目复用,减少代码冗余[^3]。 典型应用案例包括电商平台的回归测试金融系统的API验证[^1][^3]。 ### 3. **Java中的实现方法** 在Java中实现关键字驱动框架,需结合面向对象思想。以下是关键步骤代码示例: #### **步骤1: 定义关键字库** 创建Java接口实现类,封装核心操作: ```java // 关键字接口 public interface Keywords { void click(String item); void type(String item, String value); boolean verify(String item, String expectedValue); } // 实现类(例如Web测试) public class WebKeywords implements Keywords { private WebDriver driver; // Selenium WebDriver实例 @Override public void click(String item) { WebElement element = driver.findElement(By.id(item)); // 映射UI元素 element.click(); } @Override public void type(String item, String value) { WebElement element = driver.findElement(By.id(item)); element.sendKeys(value); } @Override public boolean verify(String item, String expectedValue) { WebElement element = driver.findElement(By.id(item)); return element.getText().equals(expectedValue); } } ``` #### **步骤2: 解析数据文件** 从外部文件(如Excel)读取测试数据,并解析为Java对象。引用[2]提到参数转换(Python示例),在Java中需实现类似逻辑: ```java import java.util.HashMap; import java.util.Map; public class DataParser { // 将字符串参数解析为Map(类似引用[2]的转换逻辑) public static Map<String, String> parseArguments(String input) { Map<String, String> params = new HashMap<>(); if (input != null && !input.isEmpty()) { String[] pairs = input.split(";"); for (String pair : pairs) { String[] keyValue = pair.split("=", 2); // 分割键值对 if (keyValue.length == 2) { params.put(keyValue[0], keyValue[1]); } } } return params; } } ``` #### **步骤3: 测试执行引擎** 读取数据文件,调用关键字库执行测试: ```java import java.util.List; import java.util.Map; public class TestExecutor { public static void runTest(String filePath) { List<Map<String, String>> testCases = ExcelReader.read(filePath); // 假设从Excel读取数据 Keywords keywords = new WebKeywords(); for (Map<String, String> testCase : testCases) { String operation = testCase.get("operation"); String item = testCase.get("item"); String value = testCase.get("value"); switch (operation) { case "click": keywords.click(item); break; case "type": keywords.type(item, value); break; case "verify": boolean result = keywords.verify(item, value); System.out.println("验证结果: " + result); break; } } } } ``` #### **完整框架组件**: - **数据层**:Excel/CSV文件存储测试用例(如 `operation,item,value` 行)。 - **业务逻辑层**:关键字接口实现类。 - **解析层**:数据转换工具(如 `DataParser`)。 - **执行层**:测试运行器调用引擎。 当UI元素ID变更时,只需更新 `WebKeywords` 中的元素定位逻辑,测试用例文件无需修改[^1][^2]。 ### 总结 Java关键字驱动通过分离测试逻辑与数据,显著提升自动化测试的健壮性维护性。其原理基于核心关键字分解,应用覆盖WEB/APP/接口测试,实现需结合面向对象设计数据解析技术[^1][^2][^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值