テストエンジニア技術面接:アルゴリズムとテスト設計の頻出課題

データ構造とアルゴリズムの実装

二分木の走査処理

ツリー走査とは、定義された順序に従って木構造の全ノードを漏れなく一度ずつ訪問する処理です。実装手法には主に再帰呼び出しとループ処理があり、再帰を用いる場合は訪問順序によって先序、中序、後序の 3 種類に分類されます。


// ノードデータの表示処理
void displayNode(struct TreeNode* node) {
    if (node->value != '#') {
        printf("%c ", node->value);
    }
}

// 先序走査(根 - 左 - 右)
void traversePreorder(struct TreeNode* node) {
    if (node != NULL) {
        displayNode(node);
        traversePreorder(node->left);
        traversePreorder(node->right);
    }
}

// 中序走査(左 - 根 - 右)
void traverseInorder(struct TreeNode* node) {
    if (node != NULL) {
        traverseInorder(node->left);
        displayNode(node);
        traverseInorder(node->right);
    }
}

// 後序走査(左 - 右 - 根)
void traversePostorder(struct TreeNode* node) {
    if (node != NULL) {
        traversePostorder(node->left);
        traversePostorder(node->right);
        displayNode(node);
    }
}

IP アドレスの正当性検証

IPv4 アドレスは、ドット区切りで接続された 4 つの数値グループで構成され、各数値は 0 から 255 の範囲である必要があります。正規表現を用いて形式を検証する Java の実装例を以下に示します。


public class NetworkUtil {
    public static void main(String[] args) {
        String targetIp = "192.168.0.1";
        String pattern = "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))";
        
        if (targetIp.matches(pattern)) {
            System.out.println("有効なアドレス形式です");
        } else {
            System.out.println("無効なアドレス形式です");
        }
    }
}

C 言語による文字列結合

動的メモリ確保を用いて 2 つの文字列を結合する関数です。メモリリークを防ぐため、返されたポインタは呼び出し元で解放する必要があります。


char* mergeStrings(char *strA, char *strB) {
    // 必要なメモリサイズを計算して確保
    char *buffer = (char *) malloc(strlen(strA) + strlen(strB) + 1);
    if (buffer == NULL) exit(1);
    
    char *head = buffer; // 先頭アドレスを保持
    
    // 1 文字目のコピー
    while (*strA != '\0') {
        *buffer++ = *strA++;
    }
    // 2 文字目のコピー(null ターミネータを含む)
    while ((*buffer++ = *strB++) != '\0') {
        ;
    }
    return head;
}

単方向リンクリストの反転

リンクリストのポインタ方向を逆転させる処理です。3 つのポインタ変数を用いて順次繋ぎ変える手法が一般的です。


LinkedList reverseList(LinkedList head) {
    LinkedList newHead = NULL;
    LinkedList current = head;
    LinkedList nextNode = NULL;
    
    if (head == NULL) {
        return NULL;
    }
    
    while (current != NULL) {
        nextNode = current->next;      // 次ノードを退避
        current->next = newHead;       // 逆向きにポインタ設定
        newHead = current;             // 新ヘッダを更新
        current = nextNode;            // 次へ移動
    }
    
    return newHead;
}

テスト設計とシナリオ

ソーシャル機能「いいね」のテスト観点

  • いいね状態の付与および解除が正常に動作するか
  • 権限設定により、点赞者が特定のグループに属しているか確認
  • 状態変更後の画面表示が即時に反映されるか
  • 共通の友人に対して点赞状態が可視化されるか
  • 異なる OS や端末機種における UI 表示の整合性
  • ネットワーク帯域幅の変動が処理に与える影響
  • 表示レイアウト(一行あたりの数)が仕様通りか
  • 時系列ソートおよびユーザーアイコンの対応関係
  • 通知リストにおけるユーザー名や備考表示の正確性
  • 点赞後のコメント投稿など拡張機能との連携
  • 未ログイン状態での情報閲覧制限の確認

携帯電話アプリの投稿機能テスト

  • 各機能要件が仕様通りに実装されているか
  • 投稿完了までのエンドツーエンドフローの検証
  • 通話や SMS 受信などによるアプリ中断・復帰テスト
  • 端末メモリ不足環境下での動作確認
  • 編集中の他アプリ切り替えによる状態保持テスト
  • 連続投稿による重複データ発生防止の検証

データベーススキーマ変更の検証

varchar 型の桁数拡張(例:512 から 1024 へ)を行う場合、データベース製品による文字コード扱いの違いに注意が必要です。MySQL では文字種に関わらず桁数扱いですが、SQL Server などでは漢字が複数バイトを占有する場合があります。そのため、英数字および多バイト文字を含む様々なパターンで容量テストを実施します。

HTTPS 移行時のテスト項目

  • HTTP から HTTPS への自動リダイレクト機能
  • 証明書的有效期限および発行元の検証
  • 混合コンテンツ(HTTP リソース)の検出とブロック
  • セキュリティヘッダー(HSTS など)の設定確認
  • 暗号化通信によるパフォーマンスへの影響測定

システムテストと非機能要件

マルチスレッドログ出力の順序保証

並列処理環境において、ログの発行順序が意図した通りになるかを検証します。複数のスレッドを生成し、連続した番号が出力されるか確認します。


for (int index = 0; index <= 100; index++) {
    Thread worker = new Thread(new LogTask("TASK_" + index));
    worker.start();
}

IM システムの総合テスト

  • ユーザー認証:ログインおよび登録フロー
  • 連絡先管理:友人リストの追加、削除、編集機能
  • 通信機能:メッセージの送受信および到達確認
  • セキュリティ:ローカルパスワードの暗号化保存および通信経路の暗号化

タグ: software-testing binary-tree ipv4-validation c-programming test-design

8月4日 02:20 投稿