はじめに
「前は動いてたのに、なぜか動かなくなった…」
開発を進めていると、こんな経験をしたことがある方も多いのではないでしょうか。
新機能の追加やバグ修正によって、既存の機能が壊れてしまう。これを防ぐために行うのが リグレッションテスト(回帰テスト) です。
本記事では、リグレッションテストの基本概念と、Playwrightを使った効率的な自動化方法を解説します。
リグレッションテストとは
リグレッションテストは、コードの変更後に「既存の機能が壊れていないか」を確認するテストです。
「リグレッション(regression)」は「後退」「退行」という意味で、ソフトウェアの品質が後退していないかを検証します。
なぜリグレッションテストが必要か
ソフトウェア開発では、以下のような変更が日常的に発生します。
- 新機能の追加
- 既存機能の改修
- バグ修正
- ライブラリのアップデート
- リファクタリング
これらの変更は、意図せず既存機能に影響を与えることがあります。
例えば、ログイン機能を改修した結果、関係ないはずの検索機能が動かなくなる、といったケースです。
リグレッションテストを定期的に実施することで、このような問題を早期に発見できます。
手動 vs 自動化
リグレッションテストは手動でも実施できますが、自動化するメリットは大きいです。
| 観点 | 手動テスト | 自動テスト |
|---|---|---|
| 実行速度 | 遅い | 速い |
| 実行コスト | 毎回人的工数が必要 | 初期構築後は低コスト |
| 再現性 | 担当者により差が出る | 毎回同じ条件で実行 |
| 実行頻度 | 限られる | CI/CDで毎回実行可能 |
特にリグレッションテストは「同じテストを何度も繰り返す」という性質上、自動化の効果が高いです。
Playwrightでのリグレッションテスト実装
Playwrightを使ったリグレッションテストの実装方法を解説します。
プロジェクト構成
保守性の高いテストコードにするため、Page Object Model(POM)パターンを採用します。
tests/
└── ecsite/
├── locators/ # 要素のロケーション定義
├── pages/ # ページ操作クラス
└── tests/ # テストファイル
Locatorクラスの実装
各ページの要素を定義します。
// login-page-locators.ts
export class LoginPageLocators {
static readonly EMAIL_INPUT = 'input[name="email"]';
static readonly PASSWORD_INPUT = 'input[name="password"]';
static readonly SIGN_IN_BUTTON = 'button:has-text("Sign In")';
}
Pageクラスの実装
ページ操作をメソッドとして実装します。
// login-page.ts
import { Page } from '@playwright/test';
import { BasePage } from '../base/base-page';
import { LoginPageLocators } from '../locators/login-page-locators';
export class LoginPage extends BasePage {
constructor(page: Page) {
super(page);
}
/**
* Fill in the email field
* @param email - The email address to enter
*/
async fillEmail(email: string): Promise<void> {
await this.page.locator(LoginPageLocators.EMAIL_INPUT).fill(email);
}
/**
* Fill in the password field
* @param password - The password to enter
*/
async fillPassword(password: string): Promise<void> {
await this.page.locator(LoginPageLocators.PASSWORD_INPUT).fill(password);
}
/**
* Click the Sign In button
*/
async clickSignIn(): Promise<void> {
await this.page.locator(LoginPageLocators.SIGN_IN_BUTTON).click();
}
}
Testクラスの実装
実際のテストを記述します。
// 01-login.spec.ts
import { test, expect } from '@playwright/test';
import { MainPage } from '../pages/main-page';
import { LoginPage } from '../pages/login-page';
import { MyAccountPage } from '../pages/my-account-page';
test.describe('Login Test Suite', () => {
test('User Login flow', async ({ page }) => {
const mainPage = new MainPage(page);
const loginPage = new LoginPage(page);
const myAccountPage = new MyAccountPage(page);
// Test data
const testEmail = 'test@example.com';
const testPassword = 'P@ssw0rd';
const expectedFullName = 'Test User';
// 1. Navigate to the home page
await mainPage.goto();
// 2. Click the account icon to navigate to login page
await mainPage.clickAccountIcon();
// 3. Fill in credentials
await loginPage.fillEmail(testEmail);
await loginPage.fillPassword(testPassword);
// 4. Click Sign In
await loginPage.clickSignIn();
// 5. Verify navigation to My Account page
await mainPage.clickAccountIconMyAccount();
await expect(myAccountPage.getFullNameValue()).toContainText(expectedFullName);
});
});
リグレッションテストの実行戦略
すべてのテストを毎回実行するのは非効率な場合があります。状況に応じた実行戦略を検討しましょう。
改修範囲に応じた判断
改修内容に応じてテストの実行範囲を判断します。
以下はその一例です。
| 改修内容 | テスト実行範囲 |
|---|---|
| ログイン機能の改修 | ログイン関連テスト全件 + 主要機能の正常系 |
| 検索機能の改修 | 検索関連テスト全件 + 主要機能の正常系 |
| ライブラリアップデート | 全テスト実行 |
| リリース前 | 全テスト実行 |
テストの優先度付け
リソースが限られる場合、優先度を付けてテストを選定します。
以下はその一例です。
- 最優先:壊れると売上に直結する機能(ログイン、購入、決済)
- 高:ユーザーが頻繁に使う機能(検索、閲覧)
- 中:過去にバグが発生した機能
- 低:使用頻度が低い機能
テスト失敗時のデバッグ
リグレッションテストが失敗した場合、Playwrightの機能を活用して効率的にデバッグできます。
HTML Reporterの活用
テスト結果をHTMLレポートで確認できます。
npx playwright show-report
失敗したテストのステップ、エラーメッセージを確認できます。
公式ドキュメントはこちら
Trace Viewerの活用
テスト実行中の画面状態を時系列で確認できます。
playwright.config.tsで以下の設定をしておきます。
use: {
trace: 'retain-on-failure',
},
これにより、失敗したテストのトレースが自動保存され、以下の情報を確認できます。
- どのステップで失敗したか
- その時点の画面状態
- ネットワークリクエストの状況
公式ドキュメントはこちら
まとめ
リグレッションテストは、コード変更後の品質を担保するために欠かせないテストです。
本記事のポイントをまとめます。
- リグレッションテストは「既存機能が壊れていないか」を確認するテスト
- 繰り返し実行する性質上、自動化の効果が高い
- Page Object Modelパターンで保守性の高いテストを実装する
- 改修範囲や優先度に応じてテスト実行範囲を判断する
- HTML ReporterやTrace Viewerでデバッグを効率化する
もっと詳しく学びたい方へ
本記事で紹介したPlaywrightでのリグレッションテスト自動化を、ハンズオン形式で体系的に学べる講座を公開しています。
実際のECサイトを題材に、POMパターンの実装からTrace Viewerを使ったデバッグ、AIエージェントを活用したテストコード生成まで実践的に学べます。


