cypress、nightwatch、playwright、puppeteer、testcafe は、すべて Web アプリケーションのエンドツーエンド(E2E)テストおよびブラウザ自動化を実現するためのツールです。これらは開発者がユーザーの操作をシミュレートし、アプリケーションの動作を検証するために使用されますが、内部アーキテクチャやサポート範囲に大きな違いがあります。playwright と cypress は現在、デベロッパーエクスペリエンス(DX)と機能面のバランスから最も広く採用されています。puppeteer は Chrome 制御に特化しており、nightwatch は Selenium ベースの伝統的なアプローチを維持しています。testcafe は WebDriver を使用しない独自のエンジンで動作します。
cypress、nightwatch、playwright、puppeteer、testcafe は、Web アプリケーションの品質保証において重要な役割を果たすツールですが、その設計思想と技術的なアプローチは大きく異なります。単に「テストができる」という点では同じですが、ブラウザとの通信方法、待機機制、そして開発中の体験(DX)には明確な違いがあります。ここでは、実務での導入判断に役立つ技術的な深掘りを行います。
テストツールがブラウザをどのように制御するかは、安定性と速度に直結します。
cypress はテストコードがブラウザ内で実行されます。
// cypress: ブラウザ内で実行
cy.visit('/login');
cy.get('#username').type('user');
// アプリケーションの window オブジェクトに直接アクセス可能
cy.window().then((win) => {
win.localStorage.setItem('token', '123');
});
playwright は外部プロセスからブラウザを制御します。
// playwright: 外部から制御
import { test } from '@playwright/test';
test('login', async ({ page }) => {
await page.goto('/login');
await page.fill('#username', 'user');
// コンテキストを分離して複数タブを扱える
const context = page.context();
const newPage = await context.newPage();
});
puppeteer も外部プロセス制御ですが、Chrome/Chromium に特化しています。
// puppeteer: Chrome 制御に特化
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('/login');
await page.type('#username', 'user');
await browser.close();
})();
nightwatch は Selenium WebDriver 標準を使用します。
// nightwatch: WebDriver 標準
test('login', (browser) => {
browser.url('/login');
browser.setValue('#username', 'user');
// Selenium 経由での操作
browser.end();
});
testcafe は WebDriver を使用しない独自のエンジンです。
// testcafe: 独自の注入方式
fixture `Login`
.page `http://localhost:3000/login`;
test('Enter username', async t => {
await t.typeText('#username', 'user');
// 内部でスクリプトを注入して操作を実行
});
非同期な Web アプリケーションにおいて、要素が表示されるのをどう待つかはテストの安定性を決めます。
cypress はほぼすべてのコマンドで自動待機を行います。
sleep を書く必要がほぼありません。// cypress: 自動リトライ
cy.get('.submit-btn').click();
// 要素が出現するまで自動的に待機しリトライする
cy.contains('Success').should('be.visible');
playwright も自動待機を備えていますが、より明示的な制御が可能です。
// playwright: 自動待機+明示的制御
await page.click('.submit-btn');
// 要素が操作可能になるまで待機
await page.waitForSelector('.success-message', { state: 'visible' });
puppeteer は基本的には明示的待機を要求します。
waitFor を適切に使う必要があります。// puppeteer: 明示的待機が基本
await page.click('.submit-btn');
// 手動で待機を指定する必要がある
await page.waitForSelector('.success-message', { visible: true });
nightwatch はコマンドキュー方式で、ある程度の自動待機があります。
// nightwatch: キューベースの待機
browser.click('.submit-btn');
browser.waitForElementVisible('.success-message');
testcafe は自動待機を備えています。
// testcafe: 自動待機
t.click('.submit-btn');
// 操作前に要素の準備を自動確認
t.expect(Selector('.success-message').visible).ok();
テスト対象のユーザー環境をどこまでカバーするかは、ツールの選定基準になります。
cypress は主要なモダンブラウザをサポートしていますが、内部挙動は独自です。
// cypress: ブラウザ指定
cy.visit('/', { failOnStatusCode: false });
// cypress.config.js でブラウザ設定を行う
playwright はマルチブラウザサポートが最大の強みです。
// playwright: デバイスエミュレーション
import { devices } from '@playwright/test';
test.use({ ...devices['iPhone 13'] });
await page.goto('/');
puppeteer は Chromium/Chrome 中心です。
// puppeteer: Chrome 専用
const browser = await puppeteer.launch({ product: 'chrome' });
// Firefox などは限定的サポート
nightwatch は Selenium 経由でほぼすべてのブラウザを扱えます。
// nightwatch: Selenium 経由
browser
.setWindowRect(0, 0, 1920, 1080)
.url('https://example.com');
// selenium-server 経由で各種ブラウザへ接続
testcafe は主要ブラウザをサポートします。
// testcafe: 簡単なブラウザ指定
testcafe chrome ./tests
// ドライバー不要で即座に実行可能
テストが失敗したときに、原因をどれだけ早く特定できるかも重要です。
cypress はタイムトラベルデバッグが特徴です。
// cypress: UI 上でデバッグ
cy.debug();
// 実行が停止し、ブラウザ開発者ツールと連動する
playwright はトレースビューアーを提供します。
// playwright: トレース記録
test('trace example', async ({ page }) => {
await page.context().tracing.start({ screenshots: true, snapshots: true });
await page.goto('/');
await page.context().tracing.stop({ path: 'trace.zip' });
});
puppeteer は標準の DevTools 連携が中心です。
slowMo オプションで動作を遅くして観察できます。// puppeteer: 動作を遅くして観察
const browser = await puppeteer.launch({ headless: false, slowMo: 250 });
nightwatch は Selenium 標準のログ出力に依存します。
// nightwatch: ログ出力
browser.getLog('browser', (result) => {
console.log(result.value);
});
testcafe は動画記録とスクリーンショット機能があります。
// testcafe: 動画記録
testcafe chrome ./tests --video-on-fail
これら 5 つのツールは、異なるアプローチを取りながらも、最終的な目的は同じです。
describe、it、test などのブロックでテストを整理します。beforeEach、afterEach)の仕組みを持っています。// 共通の構造イメージ
describe('Login Flow', () => {
beforeEach(() => { /* setup */ });
it('should log in', () => { /* test */ });
});
data-testid)の使用を推奨する点も共通です。// 共通のセレクター利用
cy.get('[data-testid="submit"]'); // Cypress
page.locator('[data-testid="submit"]'); // Playwright
# 共通の CI 実行イメージ
npm run test -- --headless
| 特徴 | cypress | playwright | puppeteer | nightwatch | testcafe |
|---|---|---|---|---|---|
| 制御方式 | ブラウザ内実行 | 外部プロセス | 外部プロセス | WebDriver | スクリプト注入 |
| ブラウザ | 主要 3 ブラウザ | 主要 3 ブラウザ | Chrome 中心 | 全ブラウザ (Selenium) | 主要ブラウザ |
| 待機機制 | 自動リトライ | 自動待機 | 明示的待機 | キューベース | 自動待機 |
| セットアップ | 簡単 | 簡単 | 簡単 | やや複雑 | 非常に簡単 |
| 主な用途 | 開発中テスト | E2E/統合テスト | 自動化/スクレイピング | レガシー/大規模 | 手軽な E2E |
playwright は、現在の新規プロジェクトにおいて最もバランスの取れた選択肢です。マルチブラウザサポート、高速な実行、そして強力なトレース機能は、現代的な Web 開発の要件に合致しています。特にマイクロサービス構成や、複雑な認証フローを持つアプリケーションでは、その外部プロセス制御モデルが有利に働きます。
cypress は、フロントエンド開発者がテスト駆動開発(TDD)を行う場合に依然として強力です。ブラウザ内で動作する特性によるデバッグのしやすさは、開発中のフィードバックループを短縮します。ただし、マルチタブやクロスドメインの要件がある場合はアーキテクチャ上の制限に注意が必要です。
puppeteer は、E2E テストというよりは、ブラウザを使った自動化タスク(スクリーンショット、PDF 生成、監査)に適しています。Chrome 固有の機能が必要な場合はこれが最適です。
nightwatch と testcafe は、特定の要件(Selenium 資産の活用、ドライバー管理の回避)がある場合に有効ですが、コミュニティの活発さや機能の進化速度では Playwright と Cypress に譲ります。
最終的には、チームのスキルセットと、テスト対象アプリケーションの技術スタックに合わせて、最も摩擦の少ないツールを選ぶことが重要です。
アプリケーションの開発中にリアルタイムでデバッグしながらテストを書きたい場合に最適です。ブラウザ内で動作する独特のアーキテクチャにより、テスト実行中の状態確認が容易ですが、マルチタブやクロスオリジンのサポートには制限があります。
既存の Selenium インフラや WebDriver 標準への依存が必要な場合に選択します。大規模なレガシープロジェクトの維持や、Selenium Grid を活用した並列実行要件があるチームに向いています。
最新のモダンなプロジェクトで、クロスブラウザ(Chromium, Firefox, WebKit)のサポートと高速な実行を最優先する場合の第一選択肢です。マイクロサービス間のテストや、複雑なネットワーク制御が必要な場合にも強力です。
ブラウザ自動化自体が主目的で、特に Chrome/Chromium 環境でのスクレイピング、スクリーンショット生成、PDF 作成などを重視する場合に適しています。E2E テストよりもツールングやビルドプロセスでの利用に向いています。
WebDriver のインストールや管理を完全に回避したい場合に有効です。セットアップが簡単で、Node.js エコシステムに完全に統合されていますが、コミュニティ規模は Playwright や Cypress に劣ります。
Fast, easy and reliable testing for anything that runs in a browser.
Cypress comes packaged as an npm module, which is all you need to get started testing.
After installing you'll be able to:
require Cypress as a modulePlease check our system requirements.
npm install --save-dev cypress
Please visit our documentation for a full list of commands and examples.