表单测试最佳实践:地址字段的边界值与异常处理
表单测试最佳实践:地址字段的边界值与异常处理
表单测试是保障数据质量的关键环节。地址字段由于其格式复杂性和用户输入的多样性,往往是表单测试中的重点和难点。本文将从边界值测试、异常处理和自动化测试三个方面,介绍地址字段测试的最佳实践。
边界值测试
边界值测试是发现表单缺陷的有效方法。对于地址字段,需要重点测试以下几个维度的边界值。
长度边界
| 字段 | 最小长度 | 最大长度 | 测试要点 |
|---|---|---|---|
| 街道地址 | 1 字符 | 255 字符 | 测试空值、1 字符、255 字符、超长输入 |
| 城市 | 2 字符 | 100 字符 | 测试单字符、超长城市名 |
| 州 | 固定 2 字符 | 固定 2 字符 | 测试 1 字符、3 字符输入 |
| 邮编 | 5 字符 | 10 字符 | 测试 4 位、5 位、10 位、11 位 |
测试用例示例
```javascript
const lengthTestCases = [
{ field: 'street', value: '', expected: 'invalid' },
{ field: 'street', value: '1 A St', expected: 'valid' },
{ field: 'street', value: 'A'.repeat(255), expected: 'valid' },
{ field: 'street', value: 'A'.repeat(256), expected: 'invalid' },
{ field: 'zip', value: '1234', expected: 'invalid' },
{ field: 'zip', value: '12345', expected: 'valid' },
{ field: 'zip', value: '12345-6789', expected: 'valid' },
{ field: 'zip', value: '12345-67890', expected: 'invalid' }
];
```
格式边界
邮编格式的边界测试:
```javascript
const zipFormatCases = [
{ value: '12345', expected: 'valid' },
{ value: '12345-6789', expected: 'valid' },
{ value: '123456789', expected: 'valid' },
{ value: '1234 6789', expected: 'invalid' },
{ value: '12345-678', expected: 'invalid' },
{ value: '1234a', expected: 'invalid' },
{ value: ' 12345 ', expected: 'valid' }
];
```
异常输入测试
特殊字符
地址中可能包含各种特殊字符,需要确保系统能正确处理:
```javascript
const specialCharCases = [
{ value: "123 O'Brien St", desc: '撇号' },
{ value: '123 Main St.', desc: '句号' },
{ value: '123 Main St #5', desc: '井号' },
{ value: '123 Main St/Apt 5', desc: '斜杠' },
{ value: '123 Main St (rear)', desc: '括号' },
{ value: '123 Café St', desc: 'Unicode 字符' },
{ value: '123 Main St, Apt 5B', desc: '逗号' }
];
```
SQL 注入和 XSS 防护
地址字段是潜在的注入攻击入口,必须进行安全测试:
```javascript
const securityTestCases = [
{ value: "'; DROP TABLE addresses;--", desc: 'SQL 注入' },
{ value: '<script>alert("xss")</script>', desc: 'XSS 攻击' },
{ value: '123 Main St; DELETE FROM users', desc: 'SQL 注入变体' }
];
```
确保后端使用参数化查询,前端对输出进行转义。
自动化测试
单元测试
对验证函数进行单元测试,确保各种输入都能正确处理:
```javascript
describe('Address Validation', () => {
test('should validate 5-digit zip code', () => {
expect(validateZipCode('12345')).toBe(true);
});
test('should validate ZIP+4 format', () => {
expect(validateZipCode('12345-6789')).toBe(true);
});
test('should reject invalid zip code', () => {
expect(validateZipCode('1234')).toBe(false);
expect(validateZipCode('123456')).toBe(false);
});
});
```
端到端测试
使用 Playwright 或 Cypress 进行端到端测试,模拟用户完整的地址填写流程:
```javascript
test('user can fill address form', async ({ page }) => {
await page.goto('/checkout');
await page.fill('[name="address_line1"]', '1234 Main Street');
await page.fill('[name="address_line2"]', 'Apt 5B');
await page.fill('[name="city"]', 'Los Angeles');
await page.selectOption('[name="state"]', 'CA');
await page.fill('[name="zip_code"]', '90001');
await page.click('button[type="submit"]');
});
```
测试清单
| 测试类别 | 测试项 | 优先级 |
|---|---|---|
| 必填验证 | 所有必填字段为空时提交 | 高 |
| 格式验证 | 邮编、州代码格式错误 | 高 |
| 长度验证 | 超长输入、空输入 | 高 |
| 特殊字符 | 撇号、井号、Unicode | 中 |
| 安全测试 | SQL 注入、XSS | 高 |
| 交互测试 | 国家切换后校验规则更新 | 中 |
| API 验证 | 地址验证 API 调用和回退 | 中 |
小结
地址字段的表单测试需要系统性地覆盖边界值、异常输入和安全场景。通过建立完整的测试用例集并结合自动化测试工具,可以有效提升表单的健壮性和数据质量。建议将测试用例维护为可复用的数据文件,方便持续集成和回归测试。