当社では、Selenium を使用して ASP.NET アプリケーションの UI レイヤーをテストしています。テスト ケースの多くは、複数のページにまたがる長いフローをテストします。
テストは非常に脆弱で、実際にページを変更するコードの変更だけでなく、コントロールの名前変更 (コントロールの clientID を Selenium の Click メソッドなどに渡す必要があるため) やグリッドビューのリピーターへの置き換えなどの無害なリファクタリングによっても壊れることがわかりました。その結果、壊れたテストを修正するためにテスト ケースの文字列値を更新して時間を「無駄に」していることに気づきました。
より保守しやすい Selenium テストを書く方法はありますか? または、より優れた Web UI テスト ツールはありますか?
追加編集:通常、最初のドラフトは IDE でテストを記録することによって作成されます。(この最初のステップは QA スタッフが実行できます。) 次に、生成された C# コードをリファクタリングします (定数を抽出し、繰り返されるコードのメソッドを抽出し、異なるデータでテスト ケースを繰り返すなど)。ただし、各テスト ケースのコードの一般的なフローは、最初に生成されたコードとかなり近いままです。
ベストアンサー1
PageObject パターンは非常に役立つことがわかりました。
http://code.google.com/p/webdriver/wiki/PageObjects
より詳しい情報: -セレンの目的は何ですか?-セレン批判
おそらく、テストケースを段階的にリファクタリングすることから始めるのが良いでしょう。
私はSelenium + C#と同じシナリオを使用します
私のコードは次のようになります:
テスト方法は次のようになります
[TestMethod]
public void RegisterSpecialist(UserInfo usrInfo, CompanyInfo companyInfo)
{
var RegistrationPage = new PublicRegistrationPage(selenium)
.FillUserInfo(usrInfo)
.ContinueSecondStep();
RegistrationPage.FillCompanyInfo(companyInfo).ContinueLastStep();
RegistrationPage.FillSecurityInformation(usrInfo).ContinueFinishLastStep();
Assert.IsTrue(RegistrationPage.VerifySpecialistRegistrationMessagePayPal());
selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
paypal.LoginSandboxPage(usrInfo.sandboxaccount, usrInfo.sandboxpwd);
Assert.IsTrue(paypal.VerifyAmount(usrInfo));
paypal.SubmitPayment();
RegistrationPage.GetSpecialistInformation(usrInfo);
var bphome = new BPHomePage(selenium, string.Format(Resources.GlobalResources.LoginBPHomePage, usrInfo.AccountName, usrInfo.Password));
Assert.IsTrue(bphome.VerifyPageWasLoaded(usrInfo));
Assert.IsTrue(bphome.VerifySpecialistProfile());
bphome.Logout();
}
ページオブジェクトは次のようになります
public class PublicRegistrationPage
{
public ISelenium selenium { get; set; }
#region Constructors
public PublicRegistrationPage(ISelenium sel)
{
selenium = sel;
selenium.Open(Resources.GlobalResources.PublicRegisterURL);
}
#endregion
#region Methods
public PublicRegistrationPage FillUserInfo(UserInfo usr)
{
selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserFirstName", usr.FirstName);
selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserLastName", usr.LastName);
selenium.Select("ctl00_cphComponent_ctlContent_wizRegister_ddlUserCountry", string.Format("label={0}",usr.Country ));
selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserEmail", usr.Email );
selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserDirectTel", usr.DirectTel);
selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserMobile", usr.Mobile);
return this;
}
}
お役に立てれば。