見出し画像

テストデータ作成の自動化で、開発の生産性をアップ(Cypress + Faker を活用)

ソフトウェアテストでは、アプリケーションがユーザーの期待通りに動作するかを確認するために、様々なテストデータが必要です。しかし、テストの度に手動でデータを作成・変更するのは大変な作業です。特に、アカウント登録のように一意なデータが求められる場合は、自動化が不可欠となります。
そこで活躍するのが Faker です。Fakerは、名前、住所、メールアドレスなど、様々な種類のテストデータを自動生成してくれるライブラリです。本記事では、Cypressとページオブジェクトモデル(POM)を用いて、Fakerで生成したテストデータを活用する方法を解説します。

Fakerとは?

Fakerは、テスト目的で偽のデータを生成するために使用されるライブラリです。名前、住所、電話番号、メールアドレス、その他アプリケーションのテストに一般的に必要なデータタイプのランダムデータを生成できます。Fakerは、ユーザーの操作をシミュレートしたり、データベース用のサンプルデータを生成したり、実際の機密データを使用せずにシステムのストレステストを行ったりするなど、自動化されたテストシナリオでよく使用されます。

Fakerの特徴:

  1. ランダムデータ生成:Fakerは名前、住所、メール、電話番号、日付、会社名など、さまざまな種類のランダムデータを生成できます。これにより、自動化テストのための現実的なテストデータの生成に役立ちます。

  2. 言語サポート: Fakerは複数の言語をサポートしており、地域の慣習に従ってデータを生成できます。ロケールを指定することで、地域固有の電話番号などのデータを生成できます。

  3. テストフレームワークとの容易な統合: FakerはCypress、Seleniumなど、多くのテストフレームワークと簡単に統合でき、データ駆動型のテストケースを自動化できます。

ページオブジェクトモデル(POM)を用いたFakerの実装手順:

ステップ1:Fakerライブラリをインストールする

npm install @faker-js/faker

このコマンドは、@faker-js/fakerパッケージをCypressプロジェクトにインストールするために使用します。

ステップ2:テストデータを生成する関数を作成する

"generateFakerData.js"というファイルを作成し、必要に応じてテストデータを生成する関数を記述します。

const { Faker, ja, en } = require('@faker-js/faker');
const fs = require('fs');

const faker = new Faker({
  locale: [ja, en]
});

function generateTestData() {
  const testData = {
    firstName: faker.person.firstName(),
    lastName: faker.person.lastName(),
    email: faker.internet.email(),
    mobile: '98' + faker.number.int({ min: 10000000, max: 99999999 }).toString(),
    currentAddress: faker.location.streetAddress(),
  };

  fs.writeFileSync('cypress/fixtures/testData.json', JSON.stringify(testData, null, 2));
}
generateTestData();

関数の準備ができたら、ターミナルで "node generateFakerData.js" コマンドを実行します。このコマンドは "testData.json" という名前のJSONファイルにテストデータを生成します。以下は、日本語で生成されたテストデータの例です:

{
  "firstName": "正三",
  "lastName": "中村",
  "email": "sdsn5j_kgn38@yahoo.com",
  "mobile": "9889624738",
  "currentAddress": "3丁目4番7号"
}

ライブラリのインポート:

const { Faker, ja, en } = require('@faker-js/faker');
const fs = require('fs');

jaenは日本語と英語のロケール設定です。データは可能な限り日本語形式で生成され、英語がフォールバックとして使用されます。
fsモジュールはNode.jsから提供され、ローカルファイルシステムへのファイルの読み書きに使用されます。

日本語でテストデータを生成するためのFakerの初期化:

const faker = new Faker({
  locale: [ja, en] // 日本語ロケール(英語をフォールバックとして使用)
});

この行はFakerのインスタンスを作成し、ロケール設定を指定します。

関数:

function generateTestData() {
  const testData = {
    firstName: faker.person.firstName(),
    lastName: faker.person.lastName(),
    email: faker.internet.email(),
    mobile: '98' + faker.number.int({ min: 10000000, max: 99999999 }).toString(),
    currentAddress: faker.location.streetAddress(),
  };

この関数は、firstName、lastName、email、携帯電話番号、currentAddressを含むtestDataというオブジェクトを生成します。

生成されたデータをファイルに書き込む

fs.writeFileSync('cypress/fixtures/testData.json', JSON.stringify(testData, null, 2));

fs.writeFileSync:この関数はtestDataオブジェクトをファイルに書き込みます。JSON.stringify(testData, null, 2):これはtestDataオブジェクトを整形されたJSON文字列に変換します。
nullは特別な変換が適用されないことを指定します。
2はJSONが2つのスペースでインデントされ、読みやすくなることを示します。

ステップ3:登録ページのページオブジェクトを作成する

"registration.cy.js"というファイルを作成し、以下のようにテストファイルにCSVデータをインポートします:

export class Registration {
  getFirstName() {
    return cy.get("#firstName");
  }
  getLastName() {
    return cy.get("#lastName");
  }
  getEmail() {
    return cy.get("#userEmail");
  }
  getGender() {
    return cy.get("label[for='gender-radio-1']");
  }
  getMobile() {
    return cy.get("#userNumber");
  }
  getDateOfBirth() {
    return cy.get("#dateOfBirthInput");
  }
  getDatePicker() {
    return cy.get("div[aria-label='Choose Sunday, September 22nd, 2024']");
  }
  getSubjects() {
    return cy.get(
      ".subjects-auto-complete__value-container.subjects-auto-complete__value-container--is-multi.css-1hwfws3"
    );
  }
  getHobbies() {
    return cy.get("label[for='hobbies-checkbox-1']");
  }
  getPicture() {
    return cy.get("#uploadPicture");
  }
  getCurrentAddress() {
    return cy.get("#currentAddress");
  }
  getState() {
    return cy.get("div[class=' css-yk16xz-control'] div[class=' css-1wa3eu0-placeholder']");
  }
  getaState(){
    return cy.get(".css-11unzgr").contains("NCR");
  }
  getCity() {
    return cy.get("div[class=' css-1wa3eu0-placeholder']");
  }
  getaCity(){
    return cy.get("#react-select-4-option-0");
  }
  getSubmit() {
    return cy.get("#submit");
  }

  userRegister(data) {
    this.getFirstName().type(data.firstName);
    this.getLastName().type(data.lastName);
    this.getEmail().type(data.email);
    this.getGender().click();
    this.getMobile().type(data.mobile);
    this.getDateOfBirth().click();
    this.getDatePicker().click();
    this.getSubjects().type("Maths").click();
    this.getHobbies().click();
    this.getPicture().attachFile("image.png");
    this.getCurrentAddress().type(data.currentAddress);
    this.getState().click();
    this.getaState().should('be.visible').click();
    this.getCity().click();
    this.getaCity().should('be.visible').click();
    this.getSubmit().click();
}
}

ステップ4:実行可能なテストファイルを作成する

"registration.cy.js"というファイルを作成し、テストスイート内にテストケースを記述します。

import { Registration } from "../support/registration";

describe('Registration', () => {
    it("Student Registration Form", () => {
      const register = new Registration();
      const url = "https://demoqa.com/automation-practice-form";
      Cypress.on("uncaught:exception", (err, runnable) => {
        return false;
      });
      cy.visit(url);
      cy.fixture("testData.json").then((data) => {
        register.userRegister(data);
      });
    });
  });

キャッチされない例外の処理:

Cypress.on("uncaught:exception", (err, runnable) => {
      return false;
    });

上記のコードを使用して、テスト実行中にキャッチされない例外を処理します。falseを返すことで、これらの例外がテストの失敗を引き起こすのを防ぎます。

フィクスチャからテストデータを読み込む

cy.fixture("testData.json").then((data) => {

cy.fixture()コマンドはcypress/fixturesディレクトリにあるファイルからJSONデータを読み込みます。読み込まれたデータは**.then()**関数に渡され、dataオブジェクトとして利用可能になります。

テストデータでフォームに入力する

register.userRegister(data);

これはクラスからメソッドを呼び出し、JSONファイルから読み込まれたデータを使用して登録フォームを自動的に入力します。

ステップ5:テストを実行する

コマンドラインを使用してCypressコードを実行し、結果を確認します。

npx cypress open

上記の実装により、テストデータは実行前に毎回動的に生成されます。
Githubリンク: https://github.com/BinayaBhattarai1/faker-cypress
デモウェブサイト: https://demoqa.com/automation-practice-form

読んでいただきありがとうございます。参考になりましたら幸いです。
気になることや質問がありましたら、ぜひコメントください。

この記事が役立つと感じた場合は、スキを押してもらえると嬉しいです!


この記事は、2024年9月に弊社のQAエンジニアである Binaya Bhattarai が執筆した内容を日本語に翻訳したものです。
英語版はこちらからご覧いただけます。
https://articles.wesionary.team/faker-implementation-with-page-object-model-in-cypress-3fccf333bac8


採用情報

私たちはプロダクト共創の仕組み化に取り組んでいます。プロダクト共創をリードするプロダクト・マネージャー、そして、私たちのビジョンを市場に届ける営業メンバーを募集しています!


開発パートナーをお探しの企業様へ

弊社は、グローバル開発のメリットを活かし、高い費用対効果と品質を両立しています。経験豊富で多様性のあるチームが、課題を正しく理解し、最適なシステムと優れた体験を実現します。業務システムの開発、新規事業の開発、業務効率化やDX化に関するお困りごと、ぜひ弊社にご相談ください。