投稿者【猫狸】
こんにちは。今年度入社した猫狸(ねこだぬき)です。OJTで学んだデグレチェックと自動テストについて話したいと思います。
システム保守の現場では、日々お客様からの改修要望や不具合修正に対応しています。プログラム改修後のテストにおいて重要なのが「デグレードチェック(デグレチェック)」です。
デグレードチェックとは?
デグレチェックとは、今まで動作していた機能が改修によって影響がないかチェックすることです。改修要望について対応したのに対し、他の機能が今度動かなくなってしまった・・・なんてことにならないために、システムの品質を担保するテスト項目になっています。デグレチェックは他に回帰テスト(リグレッションテスト)とも呼ばれます。
このデグレチェック、改修があるごとに確認する必要があるためエビデンス作成に時間がかかります。そこでデグレチェックのテストケースを自動化することによってリリースサイクルを早めることができるのではないかというのがOJTでの目的でした。
seleniumを利用してE2Eテストでのデグレチェックを自動化する
フレームワークはseleniumを使用しました。seleniumはWebブラウザの画面上操作を自動で行ってくれるフレームワークであり、多様な言語に対応していることが特徴です。用途はテストの自動化やスクレイピングで用いられます。OJT期間中にはログイン、登録、編集の機能の自動化を行いました。
実装でご指摘を受けたこと、躓いたことを3つ紹介いたします。
1.ハードコード
2.関心の分離と基底クラスの利用
3.待機処理の最適化
1.ハードコード
当然ですが、ハードコードで実装することはよくありません。可読性が損なわれるだけではなく、同じコードを何度も書いてしまうことによる保守観点からのリスクや、書かれている数値の意味が不明瞭であるマジックナンバーとなってしまいます。これは意識して変数や定数として利用することを心がけることで改善できました。
【NG】
//直接数値が入力されている。これでは10回なのか10秒なのか意味が明確ではない。
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
//URLのハードコード。同じコードが複数あった場合、全箇所を探して修正しなければならないため修正漏れが出るリスクがある。
driver.Navigate().GoToUrl("https://dev-server.sample.com/login");
【FIX】
~TestConstクラス~
public const int DefaultTimeoutSeconds = 10;
public const string BaseUrl = "https://dev-server.sample.com";
~Pageクラス~
//定数名で意味が明確になり可読性が向上。同じコードが複数あったとしても値の変更が一箇所で完了する。
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(TestConst.DefaultTimeoutSeconds));
driver.Navigate().GoToUrl($"{TestConst.BaseUrl}/login");
2.関心の分離と基底クラスの利用
検証する機能が違えど、テストプログラムでは画面上の要素を認識して押す、入力するなど、共通したページ操作メソッドが必要です。テストシナリオとページ操作を分離し、基底クラスとして共通化することでコードの記述量とテストコード自体の保守が簡単になります。テストシナリオとページ操作をクラスで分離する設計思想の事をPOM(Page Object Model)といいます。
3.待機処理の最適化
seleniumには待機処理等を行うことができるライブラリが用意されており、指摘前はThreadクラスのThread.Sleep()を利用していました。固定待機では最悪のケース(一番遅いケース)に合わせて設定するため、常に無駄が生じた動作確認になっていました。
そこでExpectedConditionsクラスを利用して明示的な待機にすることで処理が完了したら次の処理に移行するようにしたり、await taskを利用して非同期的な処理で流れるような動作確認となるように修正しました。結果として、1機能あたりの実行時間が3倍の速さで実行されるようになりました。
【固定待機】
//5秒待つ。固定待機であるため、1秒で次の処理の準備ができていても4秒待たなければならない。
Thread.Sleep(5000);
driver.FindElement(要素).Click();
【明示的な待機】
~TestConstクラス~
public static class TestConst
{
public const int SeleniumWaitTimeoutSeconds = 5;
}
~Pageクラス~
//フィールド変数
protected readonly WebDriverWait _wait;
//コンストラクタ
public Page(IWebDriver driver)
{
_wait = new WebDriverWait(driver,TimeSpan.FromSeconds(TestConst.SeleniumWaitTimeoutSeconds));
...
}
...
// 指定した要素がクリックできるまで最大5秒待つ。処理が0.1秒で終わっても次の処理に移行する。
_wait.Until(ExpectedConditions.ElementToBeClickable(要素)).Click;
まとめ
自動テストのプログラム作成を通して
・壊れにくいテストの工夫(関心の分離)
・壊れてもすぐに対応できる設計(共通化・定数化)
これらを意識することで継続的に運用できるテストが実現できると実感しました。この学びを今後の実務に活かし、品質向上に貢献したいと思います。








