テストエンジニアとは何者か
こんにちは。
デフエンジニアの会メンバーのゼロヨンです。
ゼロヨンの名前から分かる通り、車のモータースポーツを見るのが好きです。
そして10年ほどのプログラマーを経て最近ではテストエンジニアの仕事もやっています。
テストエンジニアってあまり知られていないと思うので、今回はテストエンジニアについて書いてみます。
はじめに
開発の現場では、テストエンジニアという言葉を耳にする機会が増えました。
一方で、テスターとの違いや、開発エンジニアとの役割の境界が曖昧なまま使われていることも少なくありません。
さらに「開発エンジニアがバグを見つけるのと何が違うの?」「バリデーションやエラーハンドリングを書くのと同じでは?」という疑問を持つ人もいるでしょう。
この記事では、テストエンジニアの具体的な説明、テスターや開発エンジニアとの違い、そして生成AI時代に求められるスキルまでを、説明します。
テストエンジニアに対してよくある誤解
ここでは、テストエンジニアに対してよくある誤解を2点書いていきます。
テストエンジニアの仕事はバグ探しではない
よくある誤解は、「テストエンジニアってツールが完成した後に色々とテストをしてバグを見つける仕事でしょ?」ということですが、実は違います。もちろん完成したあともバグを探す仕事をすることもありますが、本当の仕事はこれではありません。
テストエンジニアの本質的な役割は、品質を評価し、リスクを可視化することです。
ここで言う品質とは、単にバグがないことではありません。
例えば、次のような観点も含まれます。
?仕様どおりに動くか
?利用者が迷わず使えるか
?想定外の使われ方をしても致命的な問題が起きないか
?将来の変更に耐えられる構造になっているか
テストエンジニアは、これらを事前に考え、確認し、リスクを下げる役割を担っています。
そして、テストエンジニアの仕事は開発の最後だけではありません。
むしろ、要件定義や設計といった上流工程から関わり、開発中も継続的に品質を確認します。
「完成したものをテストする人」ではなく、「品質を作り込む人」なのです。
テストは開発の最後にやるものではない
初級者がよく誤解する点として、テストは開発の最後に行う作業だという考え方があります。
実際には、優れたテストエンジニアほど早い段階から開発に関わります。
要件定義や設計の段階で仕様を確認し、曖昧さや矛盾を見つけて指摘します。
後工程で見つかる問題ほど、修正コストは高くなります。
それで、仕様段階で潰せる問題は、コードを書く前に潰すのが最も効率的です。
だからこそ、テストエンジニアは上流の時点から関わります。
そして、起こりえるパターンをすべて洗い出し、それを指摘し、要件定義や設計の時点で潰していきます。
そして潰した状態で開発エンジニアに引き継ぎ、開発を少しでも楽にしてもらう。
これもテストエンジニアの醍醐味です。
この2点だけで、テストエンジニアとは何かがだいたいは分かってもらえたと思います。
開発エンジニアとテストエンジニアの視点の違い
ここでは、開発エンジニアとテストエンジニアそれぞれが開発の時に考えるエラーの違いを出していきます。
例: ECサイトのカート機能を評価する場合
開発エンジニアが作ったコードには、すでに入力チェックやエラーハンドリングが含まれています。
しかし、テストエンジニアはさらに広い視点で考えます。
?在庫切れの商品をカートに入れたまま他の商品を追加したらどうなる?
?決済画面で戻るボタンを押したとき、カートの中身は保持される?
?セール開始直後、1000人が同時にカートに入れたらシステムは耐えられる?
?スマホの画面で横向きにしたとき、カートのボタンは押しやすい位置にある?
これらは、コードレベルのバリデーションでは防げない問題です。
テストエンジニアは、システム全体の振る舞いや利用者の体験を評価します。
実際の動き: 要件レビューの場面
開発チームが「ログイン機能」の仕様を決めているとします。
仕様書の記述:
パスワードを3回間違えたらアカウントをロックする
テストエンジニアはここで質問します。
?「3回」はどの期間でカウントする? 1日? それとも累積?
?ロックされたアカウントはどうやって解除する? 管理者? 時間経過?
?ロック中に正しいパスワードを入れたらどういうメッセージを出す?
?別のブラウザから試したら、カウントは共有される?
こうした質問により、仕様の曖昧さが明らかになります。
これを開発前に詰めておくことで、実装後の手戻りを防げます。
このような質問をするには、システムの仕組みへの理解が欠かせません。
「実装したらどうなるか」を想像しながら仕様を読む力が、テストエンジニアには求められます。
テスターとテストエンジニアの違いとは
次は、テスターとテストエンジニアの違いについて。
これも誤解が多いですが、「テスターとテストエンジニアはほぼ同じ」違います。
テスターとは何をする人か
ここで、テスターという役割を整理します。
テスターは、テストを実行し、結果を確認する役割です。
用意されたテストケースに従うこともあれば、自由に操作して問題を探すこともあります。
テスターの仕事には次のような特徴があります。
◎テストケースや手順書が存在することが多い(ただし必須ではない)
◎実際の操作と結果確認が主な作業
◎正確さと丁寧さが強く求められる
◎探索的テストで新しい問題を見つけることもある
テスターは品質を支える重要な存在です。
ただし、基本的にはテストの全体設計や方針決定には深く関わらないことが多いです。
テストエンジニアとは何をする人か
テストエンジニアは、テストを実行する前の工程に重きを置く役割 を持っています。
具体的には、以下のような仕事を担います。
◎仕様を読み解き、リスクを洗い出す
◎テスト観点やテストケースを設計する
◎手動と自動化の使い分けを判断する
◎開発チームと品質について議論する
◎テスト環境の構築や管理を行う
テストエンジニアは、品質の設計者です。
不具合を見つけることよりも、不具合が入りにくい状態を作ることを重視 します。
テスターとテストエンジニアの違い
違いを整理すると、次のようになります。
テスターはテストを実行する
テストエンジニアはテストを設計する
どちらが上という話ではありません。
ただし、視点と責任範囲は明確に異なります。
現場によっては、一人が両方の役割を兼ねることもあります。
その場合でも、どの帽子をかぶっているかを意識することが大切です。
開発エンジニアとテストエンジニアの境界
次に、開発エンジニアとテストエンジニアとの違いです。
「開発エンジニアだってテストするし、バリデーションやエラーハンドリングを書く。テストエンジニアって本当に必要なの?」
こう思う人もいるでしょう。
ここで、具体的な違いを見てみます。
開発エンジニアが行うテスト
開発エンジニアは、自分が書いたコードが正しく動くかを確認します。
単体テスト: 関数やメソッドが仕様通り動くか
バリデーション: 不正な入力を弾けるか
エラーハンドリング: 例外が発生しても落ちないか
これらはコードレベルの品質を守るためのテストです。
開発エンジニアは「作ったものが仕様通り動くこと」に責任を持ちます。
テストエンジニアが行う評価
テストエンジニアは、システム全体や利用者視点で品質を評価します。
統合テスト: 複数の機能を組み合わせたとき、正しく動くか
ユーザビリティ評価: 利用者が迷わず使えるか
性能テスト: 大量アクセス時にシステムが耐えられるか
セキュリティ評価: 意図しない操作で情報が漏れないか
仕様の矛盾チェック: 機能A と機能B が同時に使われたときに問題はないか
これらはシステム全体の品質を評価するテストです。
視点の違いが生む価値
開発エンジニアは機能実現の視点で考えます。
テストエンジニアは利用者やリスクの視点で考えます。
例えば、会員登録機能を開発する場合:
開発エンジニアの視点:
◎メールアドレスのフォーマットチェックを実装した
◎重複登録を防ぐバリデーションを入れた
◎DBに正しく保存できることを確認した
テストエンジニアの視点:
?既に登録済みのアドレスで登録しようとしたとき、エラーメッセージは分かりやすいか?
?登録完了メールが届かなかったとき、ユーザーはどう行動する?
?同じタイミングで2人が同じアドレスで登録したらどうなる?
?パスワード再設定のメールを悪用されるリスクはないか?
開発エンジニアが書くテストコードは、主に「正常に動くこと」を確認します。
テストエンジニアは、「想定外の状況で何が起きるか」を考えます。
この視点の違いが、役割の境界です。
テスト自動化の具体例
ここまで、テストエンジニアの役割について説明してきましたが、実際の現場ではテストの「自動化」も重要な仕事の一つです。
次は、テスト自動化の具体例を書きます。
手動テストからの課題
アプリ開発では、新機能をリリースするたびに「既存機能が壊れていないか」を確認する必要があります。
例えば、写真共有アプリのログイン機能は
△新機能追加のたびに毎回テストが必要
△手順は毎回同じ
△でも1回5分×10パターン = 50分かかる
これを毎週手動でやるのは非効率です。
自動化したテストコード例
# ログイン機能の自動テスト例 (Appiumを使用)
import pytest
from appium import webdriver
class TestLogin:
def setup_method(self):
"""テスト前の準備"""
# アプリを起動
self.driver = webdriver.Remote(
'http://localhost:4723/wd/hub',
desired_capabilities={
'platformName': 'iOS',
'deviceName': 'iPhone 15',
'app': '/path/to/PhotoApp.app'
}
)
def test_login_success(self):
"""正常なログインができることを確認"""
# メールアドレスを入力
email_field = self.driver.find_element_by_id("email_input")
email_field.send_keys("test@example.com")
# パスワードを入力
password_field = self.driver.find_element_by_id("password_input")
password_field.send_keys("correct_password123")
# ログインボタンをタップ
login_button = self.driver.find_element_by_id("login_button")
login_button.click()
# ホーム画面が表示されることを確認
home_title = self.driver.find_element_by_id("home_title")
assert home_title.text == "ホーム"
def test_login_with_wrong_password(self):
"""間違ったパスワードでエラーが表示されることを確認"""
email_field = self.driver.find_element_by_id("email_input")
email_field.send_keys("test@example.com")
password_field = self.driver.find_element_by_id("password_input")
password_field.send_keys("wrong_password")
login_button = self.driver.find_element_by_id("login_button")
login_button.click()
# エラーメッセージが表示されることを確認
error_message = self.driver.find_element_by_id("error_message")
assert "パスワードが正しくありません" in error_message.text
自動化の効果
手動テストの場合:
❌1回のテスト: 50分
❌週1回実行: 月に約3.5時間
❌テスターが手作業で毎回実行
自動化した場合:
◎1回のテスト: 5分(自動実行)
◎毎日実行可能: コードをプッシュするたびに自動実行
◎テスターは結果を確認するだけ
年間で約40時間の削減になります。
でも自動化は万能ではない
このテストでは確認できないこと:
- ❌ ログイン画面のデザインが崩れていないか
- ❌ エラーメッセージが分かりやすいか
- ❌ 入力欄をタップしたときの動きが自然か
- ❌ 実際のユーザーが使いやすいか
→ これらは人の目で確認する必要があります
テストエンジニアの役割
自動化において、テストエンジニアが判断すること:
-
何を自動化すべきか
◎ログイン機能: 毎回同じ手順 → 自動化に向いている
◎デザインの確認: 人の感覚が必要 → 手動のまま -
どこまで自動化するか
◎基本的な動作だけ自動化する?
◎エラーパターンまで網羅する? -
自動化の保守
◎UI が変わったら、テストコードも更新が必要
◎この保守コストと効果を天秤にかける
開発エンジニアもテストコードを書きますが、テストエンジニアは 「テスト全体の戦略」 を考えます。
このように、自動化によってテストの効率は大きく向上しました。
しかし近年、さらに新しい技術が登場しています。それが「AI」です。
次は、AIがテストにどう活用されているのかを見ていきましょう。
AIを使ったテストとは何か
近年注目されているのが、AIを活用したテストです。
AIがすべてを自動でテストしてくれるわけではありません。
人の判断を補助する技術です。
AIを使ったテストの具体例
AIは次のような場面で活用されています。
1. テスト観点やテストケース案の生成支援
仕様書を読み込ませて、テスト観点の叩き台を作ってもらいます。
ただし、AIが出した案をそのまま使うのは危険です。抜け漏れや誤りがないか、人が判断します。
2. 大量のテスト結果やログの分析
1000件のテスト結果から、失敗の傾向を見つけるような作業に向いています。
従来: テスターが1件ずつログを見て分類する(数時間)
AI活用: AIがログをパターン分析して、同じ原因の失敗をグループ化(数分)
3. 変更影響範囲の推定と回帰テストの優先順位付け
コードの変更箇所から、影響を受けそうな機能を推定します。
- 従来: 全テストケース500件を実行(8時間)
- AI活用: AIが影響範囲を分析し、重要な100件を優先実行(2時間)
いずれも、最終判断は人が行います。
生成AI時代にテストエンジニアが伸ばすべきスキル
以上のように、近年の生成AIの普及により、テストエンジニアに求められる力は変化しています。
品質を言語化する力
AIは指示がなければ動きません。
「何が品質で、どこがリスクなのか」を言葉で説明する力が不可欠です。
例:
× 曖昧な指示: 「ログイン機能をテストして」
〇 明確な指示: 「ログイン機能について、セキュリティの観点で、特にパスワード推測攻撃やセッション乗っ取りのリスクを重点的にテストケースを設計して」
テスト観点を構造化する力
AIは案を出せますが、正解は選べません。
観点を整理し、抜け漏れを判断する力は人に残ります。
例:
AIが20個のテスト観点を出してきたとき、重複を整理し、優先度をつけ、足りない観点を補うのは人の仕事です。
開発全体を俯瞰する力
仕様変更がどこに影響するかを把握する力は、今後さらに重要になります。
これはテストエンジニアの強みです。
例:
「決済機能の仕様を変更する」という話を聞いたとき、
- 会員登録機能に影響はないか?
- ポイント機能との連携は問題ないか?
- 過去の注文履歴の表示は大丈夫か?
このように、システム全体の関係を理解している必要があります。
AIを疑う力
生成AIは便利ですが、常に正しいわけではありません。
「なぜその結果になったのか」を問い直す姿勢が必要です。
例:
AIが「このテストは不要」と判断したとき、本当に不要なのか、AIが見落としているリスクはないかを考える力が求められます。
このように、テストエンジニアもAIの時代に合わせて変わっていきます。
まとめ:皆さんもテストエンジニアを目指してみよう!
テストエンジニアは、テストをする人ではありません。
品質を設計し、評価し、リスクを可視化する人です。
開発エンジニアとの境界は視点の違いであり、
自動化や生成AIは、その視点を拡張する道具です。
テストエンジニアの仕事は、コードを書くことよりも、考えることに重きがあります。
「何が起きるか」「どこが危険か」「何を確認すべきか」を設計する仕事です。
ここまで理解できると、テストの仕事は一気に面白くなります。
あなたもテストエンジニアを目指してみませんか???