0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自動化テストのリアル | [第1回]: 自動化テストの始め方

Posted at

自動化テストのリアル:現場での始め方とつまずきポイント【完全版】

🧭 1. はじめに:自動化テスト、現場で本当にうまくいってる?

CI/CDの普及やソフトウェアのリリース頻度の増加により、「テストの自動化」はもはや選択肢ではなく前提条件になりつつあります。
しかし、現場のエンジニアと話してみると、こんな声をよく耳にします。

  • 「最初にテストを書くのが面倒で結局手動でやってる」
  • 「テストが壊れて誰も直さなくなった」
  • 「導入したけど実行時間が長すぎてCIが詰まる」

筆者自身、複数のプロジェクトでテスト自動化の設計・運用を担当してきましたが、「うまく回るようになるまでに試行錯誤が必要」なのは確かです。

本記事では、そういった経験を踏まえながら、以下のポイントを軸に解説します。

  • 自動化テストの正しい始め方(どこから?どう進める?)
  • 実際のコード例付き導入ガイド(Node.jsベース)
  • 導入後に遭遇しがちなつまずきポイントと回避策
  • 効果的なテスト戦略とCI/CDとの連携ノウハウ

🔍 2. 自動化テストとは?全体像と技術マップ

▶ 自動化テストの4つのレイヤー

テスト層 目的 ツール例 開発へのフィードバック速度
単体(Unit) 関数単位の検証 Jest, JUnit, pytest ◎ 非常に速い
結合(Integration) モジュール間の連携確認 Supertest, Testcontainers
システム(E2E) ユーザーの操作フロー確認 Playwright, Cypress △ 遅め
非機能 性能/負荷/セキュリティ JMeter, k6, OWASP ZAP

💡 理想的なバランスは「テストピラミッド」:単体 > 結合 > システム

▶ 「どこからやるか」迷ったら?

結論から言うと:

  • バックエンド API 中心のプロジェクト: 単体 & 結合テストを優先
  • UI主導のアプリ(SPAやECサイトなど): 軽量なE2Eテストを少しずつ追加
  • スタートアップ/スモールチーム: ユースケース単位の統合テストから

⚙️ 3. 実装ガイド:Node.js + Express で始めるAPI自動テスト

以下は、Node.js + ExpressベースのAPIプロジェクトに自動テストを導入するチュートリアルです。

📁 ディレクトリ構成(最低限)

my-api-project/
├── app.js
├── routes/
│   └── user.js
├── tests/
│   └── user.test.js
├── package.json
├── jest.config.js

📦 必要なパッケージ

npm install --save-dev jest supertest

✅ コアファイル解説

app.js

const express = require('express');
const app = express();

const userRoutes = require('./routes/user');
app.use('/users', userRoutes);

module.exports = app;

routes/user.js

const express = require('express');
const router = express.Router();

const dummyUsers = [
  { id: 1, name: 'Taro' },
  { id: 2, name: 'Hanako' },
];

router.get('/', (req, res) => {
  res.json(dummyUsers);
});

module.exports = router;

tests/user.test.js

const request = require('supertest');
const app = require('../app');

describe('GET /users', () => {
  it('should return a list of users', async () => {
    const res = await request(app).get('/users');
    expect(res.statusCode).toBe(200);
    expect(res.body).toHaveLength(2);
    expect(res.body[0]).toHaveProperty('name', 'Taro');
  });
});

🔄 Jest実行コマンド

npx jest --coverage
  • --coverage でカバレッジレポートも出力される
  • 毎回CIで実行すれば「品質の見える化」が可能に

💡 4. 現場でよくある課題とその解決策

❌ 落とし穴1:E2Eテスト過多

問題: 「Playwrightで全部テスト書こう!」→遅くて壊れやすい

💡 対策: クリティカルな操作フロー(ログイン、購入完了など)だけに限定。
UIの小さな変更でも壊れないように data-testid を活用。


❌ 落とし穴2:テストコードがメンテされない

問題: 本体コードのリファクタに追従できず放置 → 信頼されない

💡 対策:

  • テストコードもコードレビュー対象に含める
  • テストの役割・スコープをREADMECONTRIBUTING.mdで明文化
  • GitHub Actionsなどで強制実行

❌ 落とし穴3:DB依存テストが不安定

問題: 本番DBのデータ状況に左右されてテスト失敗

💡 対策:

  • DB層をモック化(例:jest.mock()testdouble
  • ローカル用SQLiteやTestcontainers(Docker)での隔離

🚀 5. 応用編:E2Eを安全に導入するテクニック

▶ PlaywrightによるE2E基本設定

npx playwright install
npx playwright codegen http://localhost:3000
import { test, expect } from '@playwright/test';

test('ログイン → ダッシュボード表示', async ({ page }) => {
  await page.goto('http://localhost:3000/login');
  await page.fill('#email', 'test@example.com');
  await page.fill('#password', 'password');
  await page.click('text=ログイン');
  await expect(page).toHaveURL(/dashboard/);
});

▶ おすすめの設定

  • video: 'on' で失敗時に録画
  • 並列実行 (workers: 4) で高速化
  • testIdAttributedata-testid を使う

📈 6. まとめ:現場で成功させるテスト自動化のカギ

項目 成功のためのポイント
スタート地点 ユニット・APIテストから小さく始める
実行タイミング PR作成時にCIでテスト実行
テスト対象の明確化 ドキュメント化&レビューで認識共有
信頼されるテスト 安定・高速・分かりやすい失敗レポート

✅ 今日からできるアクションリスト

  • Jestを導入して1つでもAPIのテストを書く
  • GitHub ActionsでCIと統合してみる
  • PlaywrightでログインE2Eテストを試してみる
  • --coverage でカバレッジ可視化してみる

📚 参考リンク・おすすめ資料


✍️ おわりに:テストはプロダクト品質の「保険」ではなく「資産」

自動化テストは、「バグを減らすため」だけではなく、プロダクトを安心して成長させるための基盤です。
コードを書くように、テストも「設計」「保守」「ドキュメント化」が必要です。

小さく、でも確実に。
あなたのチームの中でも「テスト文化」が根づいていくことを願っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?