1.1 简介
TestCafe是DevExpress推出的一款基于JavaScript的Web自动化测试工具,无需依赖浏览器驱动(如ChromeDriver),直接通过浏览器原生API与页面交互。它支持Chrome、Firefox、Safari、Edge等所有主流浏览器,且可在Windows、macOS、Linux跨平台运行,适合快速构建稳定的Web端到端测试用例。
1.2 特点
无驱动依赖:无需安装浏览器驱动,简化环境配置,降低入门门槛。
自动等待机制:智能等待页面元素加载和用户操作完成,无需手动添加sleep语句,提升测试稳定性。
跨浏览器与设备测试:支持本地浏览器、远程浏览器及移动设备模拟器,可一次运行多浏览器测试。
内置断言与报告:集成丰富的断言方法,自动生成HTML测试报告,包含详细的错误信息和截图。
1.3 安装
npm install -g testcafe
1.4 示例:Web百度搜索测试
1. 创建测试文件baidu-search.test.js:
import { Selector, t } from'testcafe';
fixture('百度搜索测试')
.page('https://www.baidu.com/')
.beforeEach(async () => {
// 每次测试前最大化窗口
await t.maximizeWindow();
});
test('搜索关键词"TestCafe"并验证结果', async () => {
// 定位搜索框并输入关键词
const searchInput = Selector('#kw');
await t.typeText(searchInput, 'TestCafe', { paste: true })
.pressKey('enter'); // 提交搜索
// 等待搜索结果加载,验证结果包含目标文本
const resultArea = Selector('#content_left');
await t.expect(resultArea.textContent).contains('TestCafe')
.wait(2000); // 等待查看结果
// 验证第一个搜索结果可点击
const firstResult = Selector('.result-op .c-container h3 a').nth(0);
await t.expect(firstResult.exists).ok()
.expect(firstResult.isVisible).ok();
});
2. 运行测试(指定Chrome浏览器):
testcafe chrome baidu-search.test.js
关键说明:fixture用于组织测试用例,Selector用于定位页面元素,t对象提供用户操作API;测试执行完成后,会在终端输出结果,并自动生成报告文件。
2.1 简介
Pygetwindow是一款轻量级的Python库,专注于Windows窗口管理,支持获取窗口列表、调整窗口大小、移动窗口位置、最小化/最大化窗口等操作;Pyrect作为辅助库,提供矩形区域计算功能,常与Pygetwindow配合使用,实现更精准的窗口控制。二者结合适用于Windows桌面自动化中窗口级别的操作场景。
2.2 特点
API简洁易用:窗口操作方法直观(如moveTo()、resizeTo()),学习成本低。
轻量级无依赖:安装包体积小,无需复杂配置,可快速集成到桌面自动化脚本中。
精准窗口控制:支持通过窗口标题、类名定位窗口,结合Pyrect可实现窗口区域的精确计算。
兼容性好:支持Windows 7及以上系统,与PyAutoGUI等桌面操作库可无缝配合。
2.3 安装
使用pip命令同时安装Pygetwindow和Pyrect:
pip install pygetwindow pyrect
2.4 示例:Windows窗口管理操作
# 公众号:AllTests软件测试
import pygetwindow as gw
import time
from pyrect import Rect
def window_automation():
# 1. 启动记事本(先手动打开或通过PyAutoGUI启动)
time.sleep(2) # 等待记事本启动
# 2. 通过窗口标题定位记事本窗口
notepad_window = gw.getWindowsWithTitle("无标题 - 记事本")[0]
# 3. 窗口基本操作
print("当前窗口标题:", notepad_window.title)
print("窗口是否激活:", notepad_window.isActive)
# 激活窗口
notepad_window.activate()
time.sleep(1)
# 调整窗口大小(宽800,高600)
notepad_window.resizeTo(800, 600)
time.sleep(1)
# 移动窗口到屏幕坐标(100, 100)
notepad_window.moveTo(100, 100)
time.sleep(1)
# 最大化窗口
notepad_window.maximize()
time.sleep(1)
# 最小化窗口
notepad_window.minimize()
time.sleep(1)
# 恢复窗口正常大小
notepad_window.restore()
time.sleep(1)
# 4. 获取窗口矩形区域信息
window_rect = notepad_window.rect
print("窗口矩形区域:", window_rect)
# 计算窗口中心坐标
center_x = window_rect.left + window_rect.width // 2
center_y = window_rect.top + window_rect.height // 2
print("窗口中心坐标:", (center_x, center_y))
if __name__ == "__main__":
window_automation()
关键说明:getWindowsWithTitle()通过标题模糊匹配窗口,返回窗口列表;rect属性获取窗口的位置和大小信息(left/top/width/height),结合Pyrect可实现复杂的窗口布局控制。
3.1 简介
React Testing Library是一款专注于React组件UI测试的库,由Kent C. Dodds创建,核心思想是“测试组件的行为而非实现细节”。它基于DOM Testing Library,提供了简洁的API用于查询和交互DOM元素,模拟用户真实操作场景,帮助开发者编写更健壮、易维护的React组件测试用例。
3.2 特点
行为驱动测试:鼓励测试组件在用户操作下的表现(如点击、输入),而非组件内部状态或方法,降低测试与实现的耦合度。
贴近用户操作:提供的查询方法(如getByRole()、getByLabelText())模拟用户寻找元素的方式(如通过角色、标签),更符合真实使用场景。
轻量级集成:可与Jest、Vitest等测试运行器无缝集成,无需复杂配置,快速融入React项目开发流程。
支持异步测试:内置对异步渲染(如API请求后的组件更新)的支持,提供waitFor()、findBy*等方法处理异步场景。
3.3 安装
在React项目中,通过npm安装核心库及断言扩展库:
npm install --save-dev @testing-library/react @testing-library/jest-dom
注意:@testing-library/jest-dom提供了DOM相关的断言方法(如toBeInTheDocument()),需在测试文件中导入或配置全局引入。
3.4 示例:React按钮组件测试
1. 待测试的React按钮组件(Button.jsx):
import { useState } from 'react';
function Button() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>
点击次数:{count}
</button>
<p role="status">当前计数:{count}</p>
</div>
);
}
2. 测试文件(Button.test.jsx):
// 公众号:AllTests软件测试
import { render, screen, fireEvent } from'@testing-library/react';
import'@testing-library/jest-dom';
import Button from'./Button';
describe('Button组件测试', () => {
test('组件初始渲染时显示正确文本', () => {
// 渲染组件
render(<Button />);
// 验证按钮和状态文本初始内容
const button = screen.getByRole('button', { name: /点击次数:0/i });
const statusText = screen.getByRole('status');
expect(button).toBeInTheDocument();
expect(statusText).toHaveTextContent('当前计数:0');
});
test('点击按钮后计数正确更新', () => {
render(<Button />);
const button = screen.getByRole('button');
// 模拟点击按钮2次
fireEvent.click(button);
fireEvent.click(button);
// 验证计数更新
expect(button).toHaveTextContent('点击次数:2');
expect(screen.getByRole('status')).toHaveTextContent('当前计数:2');
});
});
3. 运行测试(通常与Jest配合,执行项目中的test脚本):
npm test
关键说明:render()用于渲染React组件到虚拟DOM;screen对象提供全局查询方法;fireEvent用于模拟用户交互(如点击);断言方法需依赖@testing-library/jest-dom扩展。
4.1 简介
Selenium Grid是Selenium生态中的分布式测试框架,用于实现多浏览器、多平台、多设备的并行测试执行。它采用“Hub-Node”架构:Hub作为中心节点接收测试请求,Node作为执行节点注册到Hub并实际运行测试用例。通过Selenium Grid可大幅缩短测试套件的总执行时间,是大规模UI自动化测试的核心组件。
4.2 特点
分布式架构:Hub统一管理测试请求,Node分散执行测试,支持跨机器、跨网络部署节点。
多环境覆盖:可同时在不同浏览器(Chrome/Firefox/Edge等)、不同版本、不同操作系统(Windows/macOS/Linux)上执行测试。
并行测试执行:多个测试用例可在不同Node上同时运行,显著提升测试效率,尤其适合大型测试套件。
无缝集成Selenium:与Selenium WebDriver API完全兼容,现有Selenium脚本只需少量修改即可适配分布式执行。
4.3 安装
# 1. 下载Selenium Server(jar包)
# 从官网https://www.selenium.dev/downloads/下载最新版本的selenium-server-standalone.jar
# 2. 启动Hub节点(中心节点)
java -jar selenium-server-standalone.jar hub
# 3. 启动Node节点(执行节点,需与Hub网络互通)
# Windows示例(注册到本地Hub,指定支持Chrome浏览器)
java -jar selenium-server-standalone.jar node --hub http://localhost:4444/grid/register --capabilities "browserName=chrome,platform=WINDOWS"
# macOS/Linux示例
java -jar selenium-server-standalone.jar node --hub http://[HubIP]:4444/grid/register --capabilities "browserName=firefox,platform=LINUX"
注:启动前需确保Node节点已安装对应浏览器及驱动,且驱动路径配置到环境变量。
4.4 示例:分布式百度搜索测试
修改原有Selenium脚本,指定Hub地址执行分布式测试:
# 公众号:AllTests软件测试
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
# 配置测试所需的浏览器能力(与Node节点注册的capabilities匹配)
desired_caps = DesiredCapabilities.CHROME.copy()
desired_caps["platform"] = "WINDOWS"
# 连接Selenium Grid Hub(而非直接启动本地浏览器)
driver = webdriver.Remote(
command_executor="http://localhost:4444/wd/hub", # Hub地址
desired_capabilities=desired_caps
)
try:
# 执行百度搜索测试
driver.get("https://www.baidu.com")
driver.maximize_window()
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium Grid 分布式测试")
search_input.send_keys(Keys.ENTER)
time.sleep(3)
assert"Selenium Grid"in driver.title, "搜索结果页面标题不包含目标文本"
print("分布式测试执行成功!")
finally:
# 关闭浏览器会话(释放Node资源)
driver.quit()
关键说明:webdriver.Remote()用于连接Hub而非启动本地浏览器;desired_caps需与Node节点注册的能力匹配,Hub会自动分配符合条件的Node执行测试;可通过Hub管理界面(http://localhost:4444/grid/console)查看节点状态和测试执行情况。
5.1 简介
AutoIt是一款专为Windows平台设计的免费开源UI自动化工具,主要用于Windows图形用户界面(GUI)的自动化操作。它支持模拟键盘输入、鼠标操作、窗口控制及系统对话框(如文件上传、打印对话框)处理,拥有自己的脚本语言,可编译为独立EXE文件运行,广泛应用于Windows桌面应用自动化测试、系统运维脚本编写等场景。
5.2 特点
Windows原生适配:深度集成Windows API,对系统级控件(如按钮、文本框、对话框)的识别和操作稳定性极高。
系统对话框专长:特别擅长处理Windows原生对话框(如“打开”“保存”“打印”对话框),解决其他工具定位困难的问题。
脚本轻量易写:语法类似BASIC,简洁直观,学习成本低,支持条件判断、循环、函数等基础编程特性。
可独立运行:脚本可编译为64位/32位EXE文件,无需依赖AutoIt环境即可在其他Windows机器上执行。
5.3 安装
安装步骤如下:
1.从AutoIt官网下载最新版本的安装包(如AutoIt Full Installation)。
官网地址:
https://www.autoitscript.com/site/
2.双击安装包,按向导完成安装,默认会同时安装AutoIt脚本编辑器(SciTE Script Editor)。
3.验证安装:打开SciTE编辑器,新建脚本文件,输入MsgBox(0, "Test", "AutoIt安装成功"),按F5运行,弹出提示框即安装正常。
5.4 示例:Windows记事本自动化与保存对话框处理
创建AutoIt脚本文件NotepadAutomation.au3,内容如下:
; AutoIt 记事本自动化脚本
; 1. 启动Windows记事本
Run("notepad.exe")
; 等待记事本窗口打开(最多等待5秒)
WinWaitActive("无标题 - 记事本", "", 5)
If @error Then
MsgBox(0, "错误", "记事本窗口未找到!")
Exit
EndIf
; 2. 在记事本中输入文本
Send("AutoIt 自动化示例:\n专注Windows GUI操作,擅长处理系统对话框。")
; 3. 触发保存操作(Ctrl+S)
Send("^s")
; 等待“另存为”对话框打开
WinWaitActive("另存为", "", 5)
If @error Then
MsgBox(0, "错误", "另存为对话框未找到!")
Exit
EndIf
; 4. 处理“另存为”对话框:输入文件名并保存
; 定位文件名输入框(类名Edit,实例1)
ControlSetText("另存为", "", "Edit1", "autoit_notepad_demo.txt")
; 定位“保存”按钮(类名Button,标题“保存”)
ControlClick("另存为", "", "Button2")
; 5. 等待保存完成,关闭记事本
Sleep(2000)
WinClose("无标题 - 记事本")
; 处理关闭确认对话框(若文件已保存则不弹出)
WinWaitActive("记事本", "是否保存对", 3)
If Not @error Then
ControlClick("记事本", "", "Button1") ; 点击“是”
EndIf
MsgBox(0, "完成", "记事本自动化操作执行成功!")
运行脚本:在SciTE编辑器中按F5运行,或右键脚本文件选择“Run Script”,即可自动完成记事本操作。
关键说明:WinWaitActive()用于等待窗口激活;ControlSetText()和ControlClick()通过“窗口标题+控件类名/实例/标题”定位元素,避免坐标依赖;Send()用于模拟键盘输入,^s表示Ctrl+S组合键。
6.1 简介
Espresso是Google官方推出的Android原生UI自动化测试框架,基于Android Instrumentation API构建,专注于Android应用的UI交互测试。它支持对Activity、Fragment、View等Android组件的操作与验证,能精准模拟用户在设备上的真实操作(如点击、输入、滑动),是Android原生应用UI自动化测试的标准工具。
6.2 特点
系统级深度集成:与Android系统和应用组件紧密结合,无需额外依赖第三方驱动,测试稳定性高。
自动同步机制:智能等待UI元素加载完成和主线程空闲,无需手动添加Thread.sleep(),避免异步操作导致的测试失败。
简洁API设计:核心API(onView()、perform()、check())逻辑清晰,上手快,可快速编写可读性强的测试用例。
JUnit无缝兼容:基于JUnit测试框架,支持JUnit 4/5,可直接在Android Studio中运行,集成IDE的调试和报告功能。
录制功能支持:Android Studio内置Espresso Recorder,可录制用户操作并自动生成测试代码,降低脚本编写成本。
6.3 安装
在Android Studio项目中配置Espresso依赖,步骤如下:
1.打开模块级build.gradle(通常是app/build.gradle)。
2.在dependencies闭包中添加Espresso核心依赖:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
testImplementation 'junit:junit:4.13.2'
3. 同步项目(Sync Now),依赖会自动下载并集成。
6.4 示例:Android登录按钮交互测试
假设Android应用有一个登录界面,包含“登录”按钮(id为btn_login)和登录状态提示文本(id为tv_status),点击按钮后提示文本变为“登录成功”。测试用例如下:
// 公众号:AllTests软件测试
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
// 指定测试运行器为AndroidJUnit4
@RunWith(AndroidJUnit4::class)
class LoginActivityTest {
// 声明测试规则,指定要测试的Activity(LoginActivity为目标Activity)
@get:Rule
val activityRule = ActivityTestRule(LoginActivity::class.java)
// 测试登录按钮点击后状态文本更新
@Test
fun testLoginButtonClick() {
// 1. 定位登录按钮并执行点击操作
onView(withId(R.id.btn_login)) // 通过id定位按钮
.perform(click()) // 模拟点击操作
// 2. 定位状态文本并验证内容是否为“登录成功”
onView(withId(R.id.tv_status))
.check(matches(withText("登录成功"))) // 断言文本匹配
}
}
运行测试:在Android Studio中右键测试类,选择“Run 'LoginActivityTest'”,或通过Gradle命令./gradlew connectedAndroidTest执行设备/模拟器上的测试。
关键说明:onView()用于通过匹配器(如withId()、withText())定位View;perform()执行用户操作(如click()、typeText());check()结合断言方法(如matches())验证View状态;ActivityTestRule负责启动和管理测试Activity的生命周期。
7.1 简介
XCTest是苹果官方推出的测试框架,专为iOS、macOS、watchOS和tvOS平台的应用测试设计,支持单元测试、UI测试、性能测试等多种测试类型。其中UI测试模块(XCTest UI Testing)可模拟用户在iOS设备/模拟器上的真实操作(如点击、滑动、输入),对应用UI组件进行交互与验证,是iOS原生应用UI自动化测试的标准解决方案,与Xcode开发环境深度集成。
7.2 特点
官方原生支持:与iOS系统及Xcode工具链无缝衔接,兼容性极佳,能稳定识别系统及自定义UI组件。
Xcode集成度高:测试用例可直接在Xcode中编写、运行和调试,支持断点调试、测试报告可视化等IDE特性。
用户操作模拟精准:提供XCUIElement类封装UI元素,支持点击、输入、滑动、缩放等复杂用户交互操作。
测试录制功能:Xcode内置UI测试录制工具,可实时录制用户操作并自动生成Swift/Objective-C测试代码,降低脚本编写成本。
多类型测试支持:除UI测试外,还可实现单元测试、性能测试(如启动时间、内存占用监控),满足全流程测试需求。
7.3 安装
XCTest无需单独安装,随Xcode自带,步骤如下:
1.从Mac App Store下载并安装最新版本的Xcode(需macOS系统)。
2.打开iOS项目,在Xcode中通过“File > New > Target”创建测试目标:选择“iOS > Testing > UI Testing Bundle”,配置目标名称后点击“Finish”。
3.创建完成后,Xcode会自动生成测试文件模板,即可开始编写UI测试用例。
7.4 示例:iOS登录按钮交互测试
假设iOS应用有一个登录界面,包含“登录”按钮(accessibilityIdentifier为loginButton)和登录状态提示标签(accessibilityIdentifier为statusLabel),点击按钮后标签文本变为“登录成功”。测试用例(Swift语言)如下:
// 公众号:AllTests软件测试
import XCTest
// 测试类需继承自XCTestCase
class LoginUITests: XCTestCase {
// 应用启动实例
var app: XCUIApplication!
// 每次测试前执行,启动应用
override func setUpWithError() throws {
continueAfterFailure = false// 测试失败后停止执行
app = XCUIApplication()
app.launch() // 启动应用(需确保Xcode已配置正确的Scheme)
}
// 测试登录按钮点击后状态更新
func testLoginButtonClick() throws {
// 1. 定位登录按钮并模拟点击
let loginButton = app.buttons["loginButton"]
XCTAssertTrue(loginButton.exists, "登录按钮不存在")
loginButton.tap()
// 2. 定位状态标签并验证文本内容
let statusLabel = app.staticTexts["statusLabel"]
XCTAssertTrue(statusLabel.waitForExistence(timeout: 2), "状态标签未出现")
XCTAssertEqual(statusLabel.label, "登录成功", "登录状态文本不匹配")
}
// 每次测试后执行,清理资源
override func tearDownWithError() throws {
app = nil
}
}
运行测试:在Xcode中选择测试类或测试方法,点击左侧运行按钮,或通过“Product > Test”执行测试;也可使用Xcode命令行工具xcodebuild test在CI/CD环境中运行。
关键说明:XCUIApplication代表被测试应用,launch()方法启动应用;XCUIElement通过accessibilityIdentifier(需在应用代码中为UI元素设置)定位,避免依赖坐标或文本变化;waitForExistence(timeout:)用于等待元素加载,替代固定延迟;断言方法(如XCTAssertTrue、XCTAssertEqual)验证测试结果。
扫码关注
获取更多精彩
alltests

