name: 移动应用测试 description: 移动应用测试包括单元测试、UI自动化测试、性能测试。用于测试基础设施、端到端测试、测试标准,或遇到测试框架设置、设备农场、不稳定测试、平台特定测试错误。 keywords: 移动测试, 单元测试, UI自动化, 端到端测试, Jest, XCTest, JUnit, Detox, Espresso, Appium, React Native测试, iOS测试, Android测试, 测试框架, 设备农场, 不稳定测试, 移动测试自动化, 集成测试, 测试金字塔, 测试覆盖率
移动应用测试
实施移动应用的全面测试策略。
测试金字塔
| 层级 | 工具 | 覆盖率 |
|---|---|---|
| 单元 | Jest, XCTest, JUnit | 70% |
| 集成 | Detox, Espresso | 20% |
| 端到端 | Appium, Detox | 10% |
React Native (Jest + Detox)
// 单元测试
describe('CartService', () => {
it('calculates total correctly', () => {
const cart = new CartService();
cart.addItem({ price: 10, quantity: 2 });
expect(cart.getTotal()).toBe(20);
});
});
// 端到端测试 (Detox)
describe('Login flow', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should login successfully', async () => {
await element(by.id('email-input')).typeText('user@example.com');
await element(by.id('password-input')).typeText('password123');
await element(by.id('login-button')).tap();
await expect(element(by.id('dashboard'))).toBeVisible();
});
});
iOS (XCTest)
func testLoginSuccess() {
let app = XCUIApplication()
app.launch()
app.textFields["email"].tap()
app.textFields["email"].typeText("user@example.com")
app.secureTextFields["password"].typeText("password123")
app.buttons["Login"].tap()
XCTAssertTrue(app.staticTexts["Welcome"].exists)
}
Android (Espresso)
@Test
fun loginSuccess() {
onView(withId(R.id.email)).perform(typeText("user@example.com"))
onView(withId(R.id.password)).perform(typeText("password123"))
onView(withId(R.id.loginButton)).perform(click())
onView(withId(R.id.dashboard)).check(matches(isDisplayed()))
}
最佳实践
- 首先测试业务逻辑(单元测试)
- 模拟外部依赖
- 测试成功和失败路径
- 自动化关键用户流程
- 保持 >80% 代码覆盖率
- 定期在真实设备上测试
避免
- 测试实现细节
- 硬编码测试数据
- 相互依赖的测试
- 跳过错误案例测试