自動化テストフレームワークやツールの設計思想は「テストモデル」として分類されます。技術の進化に伴い、主に以下の4つのモデルへと発展してきました。
- リニアテスト(Linear Testing)
- モジュラー駆動テスト(Modular Driven Testing)
- データ駆動テスト(Data Driven Testing)
- キーワード駆動テスト(Keyword Driven Testing)
リニアテスト
リニアテストは最も基本的なアプローチであり、各テストスクリプトは完全に独立しています。他のスクリプトに依存したり、呼び出したりすることはありません。
- メリット: 各スクリプトが自己完結しているため、単独での実行が容易で理解しやすいです。
- デメリット:
- 開発コストの増大:テストケース間に同じ操作(例:ログイン、ログアウト)のコードが重複して記述されやすくなります。
- 保守コストの増大:重複している共通操作の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