Web UI自動化テストの設計モデル:リニアアプローチとモジュラー駆動の実践

自動化テストフレームワークやツールの設計思想は「テストモデル」として分類されます。技術の進化に伴い、主に以下の4つのモデルへと発展してきました。

  • リニアテスト(Linear Testing)
  • モジュラー駆動テスト(Modular Driven Testing)
  • データ駆動テスト(Data Driven Testing)
  • キーワード駆動テスト(Keyword Driven Testing)

リニアテスト

リニアテストは最も基本的なアプローチであり、各テストスクリプトは完全に独立しています。他のスクリプトに依存したり、呼び出したりすることはありません。

  • メリット: 各スクリプトが自己完結しているため、単独での実行が容易で理解しやすいです。
  • デメリット:
    1. 開発コストの増大:テストケース間に同じ操作(例:ログイン、ログアウト)のコードが重複して記述されやすくなります。
    2. 保守コストの増大:重複している共通操作のUIが変更になった場合、すべての関連スクリプトを個別に修正する必要があり、メンテナンスが非常に困難になります。

モジュラー駆動テスト

リニアテストが抱える保守性の低さという課題を解決するために、プログラミングにおけるモジュール化の概念を導入したモデルです。頻繁に使用される操作を共通モジュール(または共通メソッド)として切り出し、テストスクリプトから必要に応じて呼び出す形に設計します。

  • 共通処理の再実装が不要になるため、開発効率が大幅に向上します。
  • UIの変更などで共通処理を修正する際、モジュール側のみを更新すればよいため、メンテナンスの複雑性が解消されます。

Javaによる実装


// CommonActions.java
package testutils;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
import java.time.Duration;

public class CommonActions {
    
    public WebDriver launchBrowser(String targetUrl) {
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.get(targetUrl);
        return driver;
    }
    
    public void authenticateUser(WebDriver driver) throws InterruptedException {
        Thread.sleep(1000);
        driver.findElement(By.id("user_id")).sendKeys("test_admin");
        driver.findElement(By.id("user_pwd")).sendKeys("securePass123");
        driver.findElement(By.id("btn_signin")).click();
        Thread.sleep(1000);
    }
    
    public void terminateSession(WebDriver driver) throws InterruptedException {
        driver.findElement(By.id("btn_signout")).click();
        Thread.sleep(1000);
    }
}

// AuthFlowTest.java
package tests;

import testutils.CommonActions;
import org.openqa.selenium.WebDriver;

public class AuthFlowTest {
    public static void main(String[] args) throws InterruptedException {
        CommonActions actions = new CommonActions();
        WebDriver driver = actions.launchBrowser("file:///path/to/auth_page.html");
        
        actions.authenticateUser(driver);
        actions.terminateSession(driver);
        driver.quit();
    }
}

Pythonによる実装


# page_actions.py
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

class PageActions:
    
    def launch_browser(self, target_url):
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get(target_url)
        return driver

    def authenticate_user(self, driver):
        time.sleep(1)
        driver.find_element(By.ID, "user_id").send_keys("test_admin")
        driver.find_element(By.ID, "user_pwd").send_keys("securePass123")
        driver.find_element(By.ID, "btn_signin").click()
        time.sleep(1)

    def terminate_session(self, driver):
        driver.find_element(By.ID, "btn_signout").click()
        time.sleep(1)

# test_auth_flow.py
from page_actions import PageActions

if __name__ == "__main__":
    actions = PageActions()
    driver = actions.launch_browser("file:///path/to/auth_page.html")
    
    actions.authenticate_user(driver)
    actions.terminate_session(driver)
    driver.quit()

Rubyによる実装


# test_helpers.rb
require 'selenium-webdriver'

module TestHelpers
  def self.launch_browser(target_url)
    driver = Selenium::WebDriver.for :chrome
    driver.manage.timeouts.implicit_wait = 5
    driver.navigate.to target_url
    driver
  end

  def self.authenticate_user(driver)
    sleep 1
    driver.find_element(id: 'user_id').send_keys('test_admin')
    driver.find_element(id: 'user_pwd').send_keys('securePass123')
    driver.find_element(id: 'btn_signin').click
    sleep 1
  end

  def self.terminate_session(driver)
    driver.find_element(id: 'btn_signout').click
    sleep 1
  end
end

# auth_flow_test.rb
require_relative 'test_helpers'

driver = TestHelpers.launch_browser('file:///path/to/auth_page.html')
TestHelpers.authenticate_user(driver)
TestHelpers.terminate_session(driver)
driver.quit

タグ: Selenium WebAutomation TestAutomation ModularDesign Java

8月11日 14:50 投稿