掌握迭代内测试自动化:游戏规则的改变者
关于迭代内是否应该等待开发完成再进行自动化测试的争论中,一个有力的论点是使用虚拟测试用例。虚拟测试用例是简单的占位测试,可以在开发过程的早期实施,确保测试框架已就绪并正常运行。本文将探讨如何实施虚拟测试用例以及它们如何促进早期自动化测试的文化。
什么是虚拟测试用例?
虚拟测试用例是基本的、通常是极简的测试,它们在开发的早期阶段充当占位符。它们并非旨在彻底测试应用程序,而是为了确保测试基础设施的正确设置,并为后续的全面测试奠定基础。
通过现实例子理解虚拟测试的概念
登录功能的虚拟测试
让我们使用 Playwright 为登录功能创建一些虚拟测试(你也可以用类似的方法为 Selenium、Cypress、webdriver.io 编写)。这些测试将作为占位符,确保测试框架设置正确。
设置 Playwright -
npm install - save-dev playwright
创建虚拟测试
为了将虚拟测试数据保存在一个独立的文件中并将测试逻辑与数据分离,您可以按照以下步骤操作:
- 创建一个专门用于虚拟测试数据的文件
- 将虚拟测试数据移动到新文件中
- 在测试文件中导入并使用虚拟测试数据
第一步:创建并将虚拟测试数据移动到新文件
在 tests
文件夹中创建一个名为 dummyTestData.ts
的新文件。将虚拟测试数据移动到该文件:
// tests/dummyTestData.ts
export const loginTestData = {
validUser: {
username: 'validUser',
password: 'validPass',
},
invalidUser: {
username: 'invalidUser',
password: 'invalidPass',
},
// TBA = To Be Added
selectors: {
loginForm: 'TBA',
loginButton: 'TBA',
usernameInput: 'TBA',
passwordInput: 'TBA',
errorMessage: 'TBA',
welcomeMessage: 'TBA',
},
};
第二步:在测试文件中导入并使用虚拟测试数据
将虚拟测试数据导入到您的测试文件中并在测试中使用。例如,在 login.test.ts
中:
// tests/login.test.ts
import { test, expect } from '@playwright/test';
import { loginTestData } from './dummyTestData';
test.describe('Login Feature', () => {
test('Dummy Test Case 1: Page should have a login form', async ({ page }) => {
await page.goto('https://example.com/login');
const loginForm = await page.$(loginTestData.selectors.loginForm);
expect(loginForm).not.toBeNull();
});
test('Dummy Test Case 2: Login button should be disabled initially', async ({ page }) => {
await page.goto('https://example.com/login');
const loginButton = await page.$(loginTestData.selectors.loginButton);
const isDisabled = await loginButton?.isDisabled();
expect(isDisabled).toBe(true);
});
test('Dummy Test Case 3: Should display error message for invalid credentials', async ({ page }) => {
await page.goto('https://example.com/login');
await page.fill(loginTestData.selectors.usernameInput, loginTestData.invalidUser.username);
await page.fill(loginTestData.selectors.passwordInput, loginTestData.invalidUser.password);
await page.click(loginTestData.selectors.loginButton);
const errorMessage = await page.$(loginTestData.selectors.errorMessage);
expect(errorMessage).not.toBeNull();
});
// Add real tests here as development progresses
test('Real Test Case: Successful login', async ({ page }) => {
await page.goto('https://example.com/login');
await page.fill(loginTestData.selectors.usernameInput, loginTestData.validUser.username);
await page.fill(loginTestData.selectors.passwordInput, loginTestData.validUser.password);
await page.click(loginTestData.selectors.loginButton);
await page.waitForNavigation();
const welcomeMessage = await page.$(loginTestData.selectors.welcomeMessage);
expect(welcomeMessage).not.toBeNull();
});
});
解释
-
dummyTestData.ts
: 该文件包含虚拟测试数据。loginTestData
对象存储了登录功能的测试数据,包括有效和无效用户凭据以及选择器。 -
login.test.ts
: 该文件导入了loginTestData
对象,并在虚拟测试用例中使用。这将测试数据与测试逻辑分离,使代码更有条理且更易维护。
运行测试
使用 Playwright Test 运行器运行测试:
npx playwright test
虚拟测试用例的好处
- 早期发现问题:通过早期实施虚拟测试用例,团队可以在问题变得严重之前发现并解决测试框架、依赖项和配置中的问题。
- 持续反馈:虚拟测试用例为开发人员提供持续反馈,确保应用程序的基本功能从一开始就得到测试。
- 鼓励测试文化:在开发过程的早期实施虚拟测试用例,鼓励团队形成测试文化。这设定了一个预期:测试是开发过程中的一部分,而不是事后才进行的工作。
- 减少技术债务:早期测试有助于在问题积累之前发现并修复问题,减少技术债务,使代码库更易于维护。
- 促进测试驱动开发(TDD):鼓励在编写实际代码之前先编写测试的 TDD 方法。
- 成本效益高:实施虚拟测试所需的精力和资源最少,是改进测试过程的成本效益高的方式。
- 提高测试覆盖率:虚拟测试提供了基本的测试覆盖,确保至少对基本功能进行了测试。
结论
这种方法鼓励早期的自动化测试,提供持续反馈,并在开发团队中培养质量文化。通过将虚拟测试数据保存在单独的文件中,您可以保持代码库的整洁和有条理。此方法使您能够轻松管理和更新测试数据,同时保持测试文件专注于测试逻辑。这种做法不仅鼓励早期的自动化测试,还帮助在整个开发生命周期中保持高水平的代码质量。