自动化测试用例结构分析
自动化测试用例结构分析
简介
自动化测试用例结构是指为了有效地执行自动化测试而组织和设计的一套规范或布局。一个良好的测试用例结构可以提高测试脚本的可读性、可维护性和可扩展性。
操作步骤
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_method
和teardown_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"
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();
}
}
总结
通过合理组织,可以建立起清晰、可维护的自动化测试用例结构,有助于提高测试效率和质量。这种结构也使得测试脚本更易于理解、扩展和维护。