Skip to content

自动化测试用例结构分析

自动化测试用例结构分析

简介

自动化测试用例结构是指为了有效地执行自动化测试而组织和设计的一套规范或布局。一个良好的测试用例结构可以提高测试脚本的可读性、可维护性和可扩展性。

操作步骤

Inspector 录制生成用例脚本

  • el1:找到 OS 按钮

    - 调用点击方法,进入下一个页面

  • el2:找到 Morse Code 按钮

    - 调用点击方法,进入下一个页面

  • el3:找到输入框元素

    - 调用 sendkeys 方法,输入 ceshiren.com

  • 点击 2 次返回按钮

Python代码示例

el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS")
el1.click()
el2 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="Morse Code")
el2.click()
el3 = driver.find_element(by=AppiumBy.ID, value="io.appium.android.apis:id/text")
el3.send_keys("ceshiren.com")
driver.back()
driver.back()

Java代码示例

WebElement el1 = driver.findElement(AppiumBy.accessibilityId("OS"));
el1.click();
WebElement el2 = driver.findElement(AppiumBy.accessibilityId("Morse Code"));
el2.click();
WebElement el3 = driver.findElement(AppiumBy.id("io.appium.android.apis:id/text"));
el3.sendKeys("ceshiren.com");
driver.navigate().back();
driver.navigate().back();

用例脚本优化

  • 添加 Capability 信息
  • 初始化 webdriver

Python代码示例

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy

# 设置 capability
caps = {
    # 设置 app 安装的平台(Android、iOS)
    "platformName": "android",
    # 设置 appium 驱动
    "appium:automationName": "uiautomator2",
    # 设置设备名称
    "appium:deviceName": "emulator-5554",
    # 设置 app 的包名
    "appium:appPackage": "io.appium.android.apis",
    # 设置 app 启动页
    "appium:appActivity": ".ApiDemos"
}
# 初始化 driver
driver = webdriver.Remote(
    "http://localhost:4723",
    options=UiAutomator2Options().load_capabilities(caps)
)

# 找到 OS 元素
el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS")
# 点击 OS 元素
el1.click()
# 找到 Morse Code 元素
el2 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="Morse Code")
# 点击 Morse Code 元素
el2.click()
# 找到输入框元素
el3 = driver.find_element(by=AppiumBy.ID, value="io.appium.android.apis:id/text")
# 在输入框中输入内容
el3.send_keys("ceshiren.com")
# 点击返回按钮
driver.back()
driver.back()

Java代码示例

package org.example;

import io.appium.java_client.AppiumBy;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.MalformedURLException;
import java.net.URL;


public class AppiumTest {
    public static void main(String[] args) throws MalformedURLException {
        AppiumTest test = new AppiumTest();
        setUP();
        test.apiDemoTest();
    }

    private static AndroidDriver driver;

    public static void setUP() throws MalformedURLException {
        // 初始化capability
        DesiredCapabilities caps = new DesiredCapabilities();
        // 设置 app 安装的平台(Android、iOS)
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        // 设置 appium 驱动
        caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
        // 设置设备名称
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554");
        // 设置 app 的包名
        caps.setCapability("appPackage", "io.appium.android.apis");
        // 设置 app 的启动页
        caps.setCapability("appActivity", ".ApiDemos");
        // 设置 app 不清空缓存
        caps.setCapability("appium:noReset",true);
        // 设置 app 不重启
        caps.setCapability("appium:shouldTerminateApp",true);

        // 设置启动url
        URL remoteUrl = new URL("http://127.0.0.1:4723");
        // 初始化driver
        driver = new AndroidDriver(remoteUrl, caps);
    }

    public void apiDemoTest() {
        // 找到 OS 控件
        WebElement el1 = driver.findElement(AppiumBy.accessibilityId("OS"));
        // 点击 OS 控件
        el1.click();
        // 找到 Morse Code 控件
        WebElement el2 = driver.findElement(AppiumBy.accessibilityId("Morse Code"));
        // 点击 Morse Code 控件
        el2.click();
        // 找到输入框
        WebElement el3 = driver.findElement(AppiumBy.id("io.appium.android.apis:id/text"));
        // 在输入框中输入内容
        el3.sendKeys("ceshiren.com");
        // 点击返回按钮
        driver.navigate().back();
        driver.navigate().back();
    }
}

使用测试框架优化测试用例

  • 添加 setup_methodteardown_mehtod
  • 添加断言

Python代码示例

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy


class TestApiDemo:

    def setup_method(self):
        # 设置 capability
        caps = {
            # 设置 app 安装的平台(Android、iOS)
            "platformName": "android",
            # 设置 appium 驱动
            "appium:automationName": "uiautomator2",
            # 设置设备名称
            "appium:deviceName": "emulator-5554",
            # 设置 app 的包名
            "appium:appPackage": "io.appium.android.apis",
            # 设置 app 启动页
            "appium:appActivity": ".ApiDemos"
        }
        # 初始化 driver
        self.driver = webdriver.Remote(
            "http://localhost:4723",
            options = UiAutomator2Options().load_capabilities(caps)
        )

    def teardown_method(self):
        # 关闭 driver
        self.driver.quit()

    def test_api_demo(self):
        '''
        1. 打开 API demo apk
        2. 点击 OS 控件
        3. 点击 Morse Code 控件
        4. 在输入框中输入 ceshiren.com
        5. 返回上一页
        6. 返回上一页
        7. 断言
        :return:
        '''
        # 找到 OS 控件
        el1 = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS")
        # 点击 OS 控件
        el1.click()
        # 找到 Morse Code 控件
        el2 = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="Morse Code")
        # 点击 Morse Code 控件
        el2.click()
        # 找到输入框
        el3 = self.driver.find_element(by=AppiumBy.ID, value="io.appium.android.apis:id/text")
        # 在输入框中输入内容
        el3.send_keys("ceshiren.com")
        # 点击返回按钮
        self.driver.back()
        self.driver.back()
        # 断言,判断当前页面中第一个元素的文本为 Access'ibility
        result = self.driver.find_element(
            AppiumBy.XPATH,
            "//*[@resource-id='android:id/text1'][1]"
        )
        print(result.text)
        assert result.text == "Access'ibility"
Java代码示例

package org.example;

import io.appium.java_client.AppiumBy;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Objects;


public class AppiumTest {

    private static AndroidDriver driver;

    @BeforeAll
    public static void setUpMethod() throws MalformedURLException {
        // 初始化capability
        DesiredCapabilities caps = new DesiredCapabilities();
        // 设置 app 安装的平台(Android、iOS)
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        // 设置 appium 驱动
        caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
        // 设置设备名称
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554");
        // 设置 app 的包名
        caps.setCapability("appPackage", "io.appium.android.apis");
        // 设置 app 的启动页
        caps.setCapability("appActivity", ".ApiDemos");

        // 设置启动url
        URL remoteUrl = new URL("http://127.0.0.1:4723");
        // 初始化driver
        driver = new AndroidDriver(remoteUrl, caps);
    }

    @Test
    public void apiDemoTest() {
        // 找到 OS 控件
        WebElement el1 = driver.findElement(AppiumBy.accessibilityId("OS"));
        // 点击 OS 控件
        el1.click();
        // 找到 Morse Code 控件
        WebElement el2 = driver.findElement(AppiumBy.accessibilityId("Morse Code"));
        // 点击 Morse Code 控件
        el2.click();
        // 找到输入框
        WebElement el3 = driver.findElement(AppiumBy.id("io.appium.android.apis:id/text"));
        // 在输入框中输入内容
        el3.sendKeys("ceshiren.com");
        // 点击返回按钮
        driver.navigate().back();
        driver.navigate().back();
        // 断言,判断当前页面中第一个元素的文本为 Access‘ibility
        WebElement result = driver.findElement(AppiumBy.xpath("//*[@resource-id='android:id/text1'][1]"));
        System.out.println(result);
        assert Objects.equals(result.getText(), "Access'ibility");
    }

    @AfterAll
    public static void tearDownMethod() {
        driver.quit();
    }
}

总结

通过合理组织,可以建立起清晰、可维护的自动化测试用例结构,有助于提高测试效率和质量。这种结构也使得测试脚本更易于理解、扩展和维护。