Selenium フレームワーク: データ、キーワード、ハイブリッド駆動

⚡ スマートサマリー

Selenium フレームワーク:データ駆動型、キーワード駆動型、ハイブリッド駆動型のアプローチは、テスターが自動化コードをどのように整理し、テストデータを分離し、ロジックを再利用するかを定義します。この記事では、各フレームワークの種類、そのアーキテクチャ、利点、および実践的な手順を交えながら段階的に実装する方法について説明します。 Selenium WebDriverのコード例。

  • コア定義: A Selenium フレームワークとは、自動テストスクリプトの再利用性、移植性、保守性を向上させる構造化されたコードアーキテクチャのことです。
  • 📊 データ駆動型実装: Excel、CSV、またはXMLを使用してテストデータとロジックを分離し、Apache POI(XLSの場合はHSSF、XLSXの場合はXSSF)を介して入力を読み取ります。
  • 🔑 キーワード主導型デザイン: キーワードシートとオブジェクトリポジトリを通じてUIアクションを駆動し、手動テスターがコードを書かずにテストケースを作成できるようにする Java コー​​ド。
  • ⚙️ ハイブリッド最適化: 組み合わせる TestNG キーワード実行機能を備えたデータプロバイダーを利用することで、柔軟性、拡張性、およびスクリプト保守のオーバーヘッド削減を実現できます。
  • 🧩 オブジェクトリポジトリの利点: ロケーターをプロパティファイルに一元管理することで、要素の変更時にすべてのテストケースで更新が必要な箇所を1つだけに絞り込むことができます。

Selenium フレームワーク

何ですか Selenium フレームワーク?

その Selenium 自動化フレームワーク フレームワークは、テストの保守を簡素化、拡張性、効率化するための構造化されたコードアーキテクチャです。フレームワークがない場合、テスターはコードとデータを同じ場所に配置することが多く、再利用性も可読性も損なわれます。フレームワークを採用することで、コードの再利用性の向上、移植性の向上、スクリプト保守コストの削減、可読性の向上、テストロジックと入力データ間の関心の分離の明確化など、測定可能なメリットが得られます。

なぜ使用するのか Selenium 自動化フレームワーク?

うまく設計された Selenium このフレームワークは、テスト自動化における3つの根深い問題、すなわちコードの重複、脆弱なロケーター、そして管理しにくいテストデータを解決します。明確な構造を強制することで、チームは制御を失うことなく、テストスイートを少数のスクリプトから数百にまで拡張できます。

  • 保守性: 中央集約型のロケーターとヘルパーメソッドにより、1つの変更でその要素を使用するすべてのテストが更新されます。
  • 再利用性: ログイン、ナビゲーション、フォーム入力などの一般的な操作は一度記述すれば、多くのテストケースで呼び出されます。
  • スケーラビリティ: 新しいテストケースを追加する作業は、コーディング作業ではなくデータ更新作業となるため、開発者以外の人もシナリオを提供できるようになる。
  • レポート作成とコラボレーション: 標準化された構造により、レポートツール、CI/CDパイプライン、バージョン管理システムとの統合が容易になります。

の種類 Selenium フレームワーク

3つの主要な フレームワークの種類 上に構築された Selenium WebDriverは、手動テストケースを自動化するためのツールです。各スタイルは、開発者の労力、テスターの関与、データの柔軟性のバランスをそれぞれ異なるように設計されています。

  • データドリブンフレームワーク
  • キーワード駆動フレームワーク
  • ハイブリッド駆動フレームワーク

の種類 Selenium フレームワーク

次のセクションでは、最もシンプルなデータ駆動型アプローチから始まり、最も柔軟なハイブリッドモデルへと進むにつれて、それぞれのフレームワークを詳細に説明します。

データドリブンフレームワーク Selenium

データドリブンフレームワーク Selenium これは、テストデータセットをテストケースロジックから分離する方法です。データが分離されると、テストコードに手を加えることなく、特定の機能の入力を変更できます。これは、次のような外部ソースからテストケースやテストスイートを取得するためによく使用されます。 Excel.csv、.xml、またはデータベーステーブル。

データドリブンフレームワーク Selenium

Excel ファイルの読み書きには、Apache が提供する有名な POI ライブラリを使用できます。このライブラリは、Excel ファイルの読み書きと Excel ファイルの書き込みの両方に対応しています。 XLS (NAIST) と XLSX フォーマット。 の HSSF 実装では従来の XLS ファイルを読み込むが、 XSSF この実装は最新のXLSXファイルに対応しています。

データ駆動型テストについては既に説明済みです 前のチュートリアル.

キーワード駆動フレームワーク Selenium

キーワード駆動フレームワーク Selenium これは、共通の機能や命令のキーワードを分離することで自動化を加速する手法です。すべての操作と命令は外部ファイル(通常は Excel シート)に記述されます。テスターは、変更を加えることなく検証したい機能を指定できます。 Java このスタイルは、ビジネスアナリストや手動QA担当者がテスト定義を提供するチームに最適です。

フレームワーク全体の構成は以下のようになります。

キーワード駆動フレームワーク Selenium

ご覧のとおり、これは5つのステップからなるフレームワークです。それでは、各ステップを詳しく見ていきましょう。

ステップ1)

  • ドライバスクリプトExecute.javaはReadを呼び出す。Guru99ExcelFile.java
  • タリアセン・ウェストにおける修復作業についてGuru99ExcelFile.javaには、Excelからデータを読み取るPOIコードが含まれています。

ステップ2)

  • タリアセン・ウェストにおける修復作業についてGuru99ExcelFile.javaはTestCase.xlsxからデータを読み込みます。
  • シートは以下のようになります。

キーワード駆動型フレームワークのExcelシート Selenium

  • Excelファイルに記述されたキーワードに基づいて、フレームワークはUI上で対応するアクションを実行します。
  • 例えば、「ログイン」というラベルのボタンをクリックする場合、Excelシートにはキーワード「Click」が格納されます。ページ上の多数のログインボタンの中から特定のボタンを識別するために、Excelの行ではオブジェクト名を「loginButton」、オブジェクトタイプを「name」と定義します(画像で強調表示されている行を参照)。オブジェクトタイプには、XPath、CSS、クラス、またはその他のロケーター戦略を指定することもできます。

ステップ3) タリアセン・ウェストにおける修復作業についてGuru99ExcelFile.java は解析されたデータをドライバスクリプト Execute.java に渡します。

ステップ4)

  • すべてのUIウェブ要素について、XPath、名前、CSS、クラス名などの要素ロケータを格納するオブジェクトリポジトリを管理します。

キーワード駆動型フレームワークにおけるオブジェクトリポジトリ

  • Execute.java(ドライバスクリプト)は、オブジェクトリポジトリ全体を読み込み、それを変数に格納します。
  • ヘルパークラスであるReadObjectクラスは、実行時にリポジトリをロードするgetObjectRepositoryメソッドを公開します。

キーワード駆動型フレームワーク用のReadObjectヘルパークラス

注: オブジェクトリポジトリが必要な理由を疑問に思うかもしれません。その答えは保守性です。例えば、名前が「btnlogin」のボタンが10個のテストケースで使用され、開発者がそれを「submit」に名前変更した場合、そうでなければ10個のファイルを編集する必要があります。オブジェクトリポジトリを使用すれば、ロケーターを1箇所変更するだけで済みます。

ステップ5)

  • ドライバーはExcelとオブジェクトリポジトリからUIにデータを渡すOperaションクラス。
  • UIOperationには、CLICKやSETTEXTなどの各キーワードを具体的なWebDriverアクションにマッピングする関数が含まれています。
  • UIOperation は Java ウェブ要素とのやり取りに関する実際の実装を保持するクラス。

UIOperaキーワード駆動型フレームワークのtionクラス

プロジェクト全体の構造は以下のようになります。

キーワード駆動型フレームワークの完全なプロジェクト構造

具体的な例を見てみましょう。

テストシナリオ: 私たちは2つのテストケースを実行しています。

  • テストケース1:
  • 後藤 https://demo.guru99.com/V4/
  • ユーザーIDを入力してください
  • パスワードを入力します
  • [リセット]をクリックします
  • テストケース2:
  • 後藤 https://demo.guru99.com/V4/
  • ユーザーIDを入力してください
  • パスワードを入力します
  • ログインをクリックします

オブジェクトのプロパティ

url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

タリアセン・ウェストにおける修復作業についてGuru99ExcelFile.java

package excelExportAndFileIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadGuru99ExcelFile {
    public Sheet readExcel(String filePath, String fileName, String sheetName) throws IOException {
        // Create a File object to open the xlsx file
        File file = new File(filePath + "\\" + fileName);
        // Create a FileInputStream to read the Excel file
        FileInputStream inputStream = new FileInputStream(file);
        Workbook guru99Workbook = null;
        // Detect the file extension
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        if (fileExtensionName.equals(".xlsx")) {
            guru99Workbook = new XSSFWorkbook(inputStream);
        } else if (fileExtensionName.equals(".xls")) {
            guru99Workbook = new HSSFWorkbook(inputStream);
        }
        // Read the sheet inside the workbook by its name
        Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
        return guru99Sheet;
    }
}

ReadObject.java

package operation;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ReadObject {
    Properties p = new Properties();

    public Properties getObjectRepository() throws IOException {
        // Read the object repository file
        InputStream stream = new FileInputStream(new File(System.getProperty("user.dir") + "\\src\\objects\\object.properties"));
        // Load all objects
        p.load(stream);
        return p;
    }
}

UIOperation.java

package operation;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class UIOperation {
    WebDriver driver;

    public UIOperation(WebDriver driver) {
        this.driver = driver;
    }

    public void perform(Properties p, String operation, String objectName, String objectType, String value) throws Exception {
        System.out.println("");
        switch (operation.toUpperCase()) {
            case "CLICK":
                driver.findElement(this.getObject(p, objectName, objectType)).click();
                break;
            case "SETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
                break;
            case "GOTOURL":
                driver.get(p.getProperty(value));
                break;
            case "GETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).getText();
                break;
            default:
                break;
        }
    }

    private By getObject(Properties p, String objectName, String objectType) throws Exception {
        if (objectType.equalsIgnoreCase("XPATH")) {
            return By.xpath(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CLASSNAME")) {
            return By.className(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("NAME")) {
            return By.name(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CSS")) {
            return By.cssSelector(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("LINK")) {
            return By.linkText(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("PARTIALLINK")) {
            return By.partialLinkText(p.getProperty(objectName));
        } else {
            throw new Exception("Wrong object type");
        }
    }
}

ExecuteTest.java

package testCases;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class ExecuteTest {
    @Test
    public void testLogin() throws Exception {
        WebDriver webdriver = new FirefoxDriver();
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        // Read keyword sheet
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        // Find the number of rows in the Excel file
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        for (int i = 1; i < rowCount + 1; i++) {
            Row row = guru99Sheet.getRow(i);
            if (row.getCell(0).toString().length() == 0) {
                System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
                        row.getCell(3).toString() + "----" + row.getCell(4).toString());
                operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
                        row.getCell(3).toString(), row.getCell(4).toString());
            } else {
                System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
            }
        }
    }
}

実行後の出力は次のようになります。

キーワード駆動型フレームワークの実行出力

ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル

ハイブリッド駆動フレームワーク

ハイブリッド駆動フレームワーク in Selenium キーワード駆動型フレームワークとデータ駆動型フレームワークの両方の長所を兼ね備えています。使いやすいモデルで、手動テスターはフレームワークコードを記述することなく、キーワード、テストデータ、オブジェクトリポジトリを編集するだけで簡単にテストケースを作成できます。

ここでは、Excel ファイルには各ステップのキーワードが保持され、 TestNGさん データプロバイダー テストデータを提供します。この分割により、アクション語彙と入力バリエーションの両方を個別にスケーリングできます。

ハイブリッド駆動型フレームワークアーキテクチャ

ハイブリッドフレームワークの場合、キーワード駆動型構造に変更はありません。単にExecuteTest.javaをHybridExecuteTest.javaに置き換えるだけです。

ハイブリッド駆動フレームワークのコンポーネント交換

この HybridExecuteTest ファイルには、キーワード駆動ロジック全体と TestNGのデータプロバイダーメカニズム。

ハイブリッドフレームワークの完全な図解は次のようになります。

ハイブリッド駆動フレームワークの完全な表現

ハイブリッド実行テスト.java

package testCases;
import java.io.IOException;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class HybridExecuteTest {
    WebDriver webdriver = null;

    @Test(dataProvider = "hybridData")
    public void testLogin(String testcaseName, String keyword, String objectName, String objectType, String value) throws Exception {
        if (testcaseName != null && testcaseName.length() != 0) {
            webdriver = new FirefoxDriver();
        }
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        operation.perform(allObjects, keyword, objectName, objectType, value);
    }

    @DataProvider(name = "hybridData")
    public Object[][] getDataFromDataprovider() throws IOException {
        Object[][] object = null;
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        object = new Object[rowCount][5];
        for (int i = 0; i < rowCount; i++) {
            Row row = guru99Sheet.getRow(i + 1);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                object[i][j] = row.getCell(j).toString();
            }
        }
        System.out.println("");
        return object;
    }
}

ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル

よくあるご質問

手動テスターがコーディングなしでテストケースを作成する必要がある場合は、「キーワード駆動型」を選択してください。同じスクリプトを多数の入力バリエーションに対して実行する必要がある場合は、「データ駆動型」を選択してください。データの柔軟性とキーワードレベルのテスト作成の両方を同時に必要とする場合は、「ハイブリッド型」を使用してください。

Apache POIは、データソースとして使用されるExcelファイルの読み書きを行います。HSSFは従来の.xlsファイルを処理し、XSSFは最新の.xlsxファイルを処理します。これらを組み合わせることで、テストスクリプトはデータをハードコーディングすることなく、スプレッドシートから動的な入力を取得できます。

オブジェクトリポジトリは、XPath、CSS、名前などの要素ロケーターを一元管理します。開発者がUIコントロールの名前を変更した場合、すべてのテストケースではなく、1つのエントリを更新するだけで済むため、メンテナンス時間を大幅に削減し、スクリプトが破損するリスクを低減できます。

AIが向上する Selenium 自己修復型ロケーター、インテリジェントなテスト優先順位付け、およびビジュアル検証を通じてフレームワークを強化します。AIエンジンはロケーターのずれを検出し、安定したセレクタを推奨し、障害パターンを分析することで、テスト対象アプリケーションの進化に合わせてハイブリッドスイートの信頼性を維持します。

はい。最新のAIアシスタントは、テスト対象のアプリケーションを分析し、キーワードライブラリ、サンプル入力、エッジケースを提案します。テスターは提案を確認して改良し、フレームワークのセットアップを加速させながら、ping 重要な検証ロジックに対する人間の監視。