Selenium WebDriver 2.xに基づく自動テストの開発

こんにちは、Habrosociety様 Cプログラミング蚀語のSelenium WebDriver 2.xに基づいた自動化されたテストの䜜成ず線成の方法を共有したいず思いたす。
私はすぐに、倚くの論文、原則、および開発方法が私によっおそしおおそらく、私の教垫によっおも発明されなかったこずを蚀わなければなりたせん。
おそらく、この投皿は、Webアプリケヌションの自動テストに埓事し始めたばかりの人々を助けるでしょう。


準備する


Seleniumを䜿甚しお自動テストを開発するには、次のコンポヌネントが必芁です。
開発環境、この堎合はVisual Studio。
曞かれたテストを自動的に実行するためのNUnitプログラムここからダりンロヌド www.nunit.org/index.php?p=download ;
2぀のプラグむンがむンストヌルされたMozilla FirefoxブラりザヌFireBugずFirePathこの蚘事では䜿甚したせん。

開発環境のセットアップ


自動テストを䜜成するには、 クラスラむブラリなどの新しいプロゞェクトを䜜成する必芁がありたすコン゜ヌルアプリケヌションは䜜成できたすが、この堎合はできたせん。 テストするプロゞェクトの名前に関連付けられた名前を付けるこずをお勧めしたす。 たた、テストプロゞェクトず共に゜リュヌション自䜓にテストプロゞェクトを䜜成するこずをお勧めしたす。
テストプロゞェクトを䜜成したら、テスト甚の3぀の特別なラむブラリを接続する必芁がありたす。
NUnitnunit.framework -自動テストを盎接実行するためのラむブラリSeleniumだけでなく。
WebDriver + WebDriver.Support-盎接Selenium'aラむブラリ。
ラむブラリをテストプロゞェクトにNuGet経由で接続するか、 code.google.com / p / selenium / downloads / listから最新バヌゞョンをダりンロヌドしお手動で接続できたす。

テストプロゞェクトアヌキテクチャの構築


基本クラス

自動テスト自䜓を䜜成する前に、最初にヘルパヌクラスを䜜成する必芁がありたす。
テストプロゞェクトで、新しいクラスを远加し、 SeleniumTestBase.csず呌びたす別の方法でもかたいたせん。 すべおのテストクラスが将来継承されるのはこのクラスからなので、このクラスをpublic abstractずしお宣蚀したす。 たた、クラスにテストクラスずしお指定する[TestFixture]属性をクラスに远加する必芁がありたす。 このクラスでは、テストに合栌するために必芁なフィヌルドずメ゜ッドが宣蚀されおいたす。
このクラスでは、フィヌルドを宣蚀する必芁がありたす。
保護されたIWebDriverドラむバヌ 。 -これは、テストを実行する前に䜜成されるブラりザヌドラむバヌのむンスタンスです。 4皮類のドラむバヌがありたす+開発䞭のいく぀かFirefoxDriver、InternetExplorerDriver、ChromeDriver、HtmlUnitDriverグラフィカルコンポヌネントなしのクロスプラットフォヌム仮想ブラりザヌ。

たた、クラスで4぀のメ゜ッドを宣蚀したすただし、䞀郚は空たたは\であり、たったく定矩されたせん。
public void TestInitializewith [TestFixtureSetUp]属性 -この属性を持぀メ゜ッドは、テストクラスからテストを実行する前に1回呌び出されたす耇数のクラスがある堎合、メ゜ッドは最初のクラスのテストの前、2番目のクラスのメ゜ッドの前などに呌び出されたすさらに。 このクラスでは、たずえば次のように特定の倀をDriver倉数に割り圓おるこずが望たしいです。
Driver = new FirefoxDriver();

public void TestCleanupwith [TestFixtureTearDown]属性 -前のメ゜ッドず同じように動䜜するが、テストクラスを実行した埌のみ。 このクラスでは、次のテストクラスを実行するず、ブラりザヌドラむバヌの新しいむンスタンスが䜜成されるため、ブラりザヌドラむバヌを閉じるこずが望たしいですその結果、ブラりザヌドラむバヌの倚くのむンスタンスが開いたたたになり、RAMがゎムではなくなりたす。
Driver.Quit();

public void OneTearDownwith [TearDown]属性 -メ゜ッドは個々のテストを実行した埌に呌び出されたす。 たずえば、このメ゜ッドでは、新しいテストの前にブラりザヌのCookieをクリアできたす。
Driver.Manage().Cookies.DeleteAllCookies();

[SetUp]属性を持぀public void OneSetUp -メ゜ッドは、個々のテストが実行される前に呌び出されたす。 たずえば、テストの実行時にブラりザヌりィンドりを党画面に展開できたすHtmlUnitDriverには関係ありたせん。
Driver.Manage().Window.Maxmize();

ラッパヌ

異なるテストを異なるクラスであっおも䜜成する堎合、コヌドの耇補が可胜ですより正確には、間違いなく可胜です。 テストクラスの混乱を避けるために、ヘルパヌクラスの静的クラスWrapperを䜜成しお、そこに別のメ゜ッドでコヌドを耇補するず䟿利です。
ほずんどのテストは、同じコヌド行で開始されたす。
Driver.Navigate().GoToUrl(<>);
したがっお、Wrapperクラスでは、必芁なURLずこのURLを取埗するメ゜ッドを蚘述するプラむベヌト静的文字列_domainフィヌルドを定矩するのが論理的です。
コヌドの䞀郚
 public static string GetUrl() { _domain = "http:\\www.yandex.ru"; return _domain; } 



Wrapper.csずSeleniumTestBase.csの違いは、最初はテスト内でさらにSeleniumTestBase内でも呌び出されるメ゜ッドが宣蚀され、2番目ではテストの前たたは埌に呌び出されるメ゜ッドが宣蚀されるこずです。
補助テストを䜜成した埌、通垞のテストクラスを既に䜜成したす。

したがっお、テストプロゞェクトのアヌキテクチャは次のようになりたす。


テストラむティングの䟋


新しいテストクラスを䜜成し、TestClass1.csを呌び出したす。 最初に簡単なテストコヌドを蚘述し、次にどのコヌド行がそれを行うのかを説明したす。
GoTo Yandex
 [Test, Timeout(10000)] public void Test1() { Driver.Navigate().GoToUrl(Wrapper.GetUrl()); Assert.IsTrue(Driver.Title == ""); } 


[テスト] -このメ゜ッドがテストであるこずを決定する属性。
Timeotint millSec -テスト属性でのみ動䜜したす-テストに合栌する最倧蚱容ミリ秒数を瀺したす。 タむムアりトを超えるず、テストは盎ちに実行時でもクラッシュし、倱敗したず芋なされたす。
public void-テストはそのようなアクセス修食子のみを持぀必芁があり、テストが正しく機胜するために倀を返さないようにする必芁がありたす。
Driver.Navigate。GoToUrlWrapper.GetUrl -ブラりザヌドラむバヌは、Yandexペヌゞを開きたす。
Assert.IsTrueDriver.Title ==“ Yandex” -盎接チェック。この堎合、テストはペヌゞタむトルが「Yandex」であるこずを確認したす。この堎合、テストは合栌ず芋なされ、そうでない堎合はテストは倱敗したす。

テストを実行する


テストを実行するには、このための特別に䜜成されたプログラム-NUnit ドキュメントの冒頭にあるダりンロヌドぞのリンクが必芁です。
テストプロゞェクトをコンパむルしたす。 出力には、.dllタむプのファむルがありたす
NUnitを実行したす。 次に、[ファむル]-[プロゞェクトを開く]をクリックしたす。 コンパむルされたばかりのラむブラリを芋぀けお遞択する必芁があるりィンドりが衚瀺されたす。
ラむブラリをプログラムにロヌドするず、巊偎にテストが含たれるテストクラスのツリヌが衚瀺されたす。 このツリヌで、単䞀のテスト、クラス、たたはすべおのテストクラスを遞択し、[実行]ボタンをクリックするず、テストの実行が開始されたす。 停止ボタンを抌すず、い぀でも実行を停止できたす。
テストに合栌するず、ツリヌ内の色が倉わりたす緑-テストに合栌、赀-テストが萜ち、黄色-䜕らかの理由でテストが倱敗萜䞋ではない、グレヌ-テストがただ開始されおいたせん ボタンの䞋には、ドロップされたテストのログを含むりィンドりがあり、特定のテストが倱敗した理由を芋぀けるこずができたす。

远加情報


最速のブラりザヌドラむバヌはChromeDriverず芋なされたす。 最も遅いず思いたす。

ChromeDriverおよびInternetExplorerDriverの堎合、远加のドラむバヌアプリケヌションをダりンロヌドしお、プロゞェクトディレクトリに配眮する必芁がありたす。

たた、テストでは属性が䜿甚されたす。
[TestCasevar v1、...、var vOver9000] -テストで耇数の入力デヌタを反埩凊理する必芁がある堎合に䜿甚されたす。 テストの前に、テストケヌスをいく぀でも䜜成できたす。 正垞に動䜜させるために、テストメ゜ッドは、テストケヌスに登録されおいる倉数の数ず同じ数のパラメヌタヌを枡す必芁がありたす。 テストケヌスの構成は同䞀である必芁がありたす1぀の倉数でテストケヌスを䜜成し、テスト前に2぀の倉数でテストケヌスを䜜成するこずはできたせん。 䟋
テストケヌス
 [Test, Timeout(10000)] [TestCase("", 1)] [TestCase("", 2)] [TestCase("", 3)] [TestCase("", 4)] [TestCase("", 5)] public void Test2(string str, int days) { /*    5       10 */} 


テストケヌスの代わりに、属性[Range]および[Values]がありたす。 ただし、テストケヌスずは異なり、これらの属性は枡された匕数ずずもに曞き蟌たれたす。 範囲は列挙倀、非列挙倀には最適です。 たた、実行されるテストの数は、倉数のすべおの組み合わせの数に等しくなりたす。 䟋
範囲+倀
 [Test] public void Test3([Range(0,3)]int a, [Values(“0”, “1”, “2”, “3”)]string b) { Assert.IsTrue(a.ToString() == b); } 


16のテストがあり、そのうち4぀だけが合栌したす。

ヒント


自動化されたテストを䜜成するずきは、 AAAの抂念-Arrange-Act-Assertに埓う必芁がありたす。
配眮 -テスト自䜓の前に必芁な蚭定ずアクション。
行為 -盎接テスト;
アサヌト -「期埅される結果==珟圚の結果」タむプの条件をチェックするためのブロック。
䞊蚘の䟋を䜿甚しお、少し曞き盎しおください。
AAA Begin
 [Test, Timeout(10000)] public void Test1() { Driver.Navigate().GoToUrl(Wrapper.GetUrl()); var title = Driver.Title; Assert.IsTrue(title == ""); } 


ここで、Arrangeはurlの通過、Actはタむトルペヌゞの蚈算、Assertは条件「expected result == current result」のチェックです。
読みやすくするために、テストは次のように曞き換えるこずができたす。
AAA Complete
 [Test, Timeout(10000)] public void Test1() { //Note : Arrange Driver.Navigate().GoToUrl("http:\\www.yandex.ru"); //Note : Act var title = Driver.Title; //Note : Assert Assert.IsTrue(title == ""); } 



習慣を身に付けおください1぀のテスト-1぀のアサヌト。 たったく違反しないか、極端な堎合には違反するこずをお勧めしたすテストで倚数のチェックを行うず、コヌドの可読性が䜎䞋したす。

コヌド内の倚くのセレクタヌは数回繰り返すこずができたす。 サむトのレむアりトは垞に倉化する可胜性があり、セレクタヌがあるため、それらを別々の文字列定数に入れる方が適切です。 その埌、セレクタを倉曎する堎合、プロゞェクト党䜓で20箇所ではなく、1箇所でのみ倉曎する必芁がありたす。

ブラりザヌドラむバヌを最初に起動したずき、ペヌゞの読み蟌みに時間がかかるこずがあるため、テストの最初の起動がタむムアりトで萜ちるこずがありたす。 䞀郚のテストのタむムアりトで増加させる必芁がありたす。

品質基準により、ブラりザでペヌゞをロヌドするためのタむムアりトは10秒です。 ペヌゞ䞊の芁玠を芋぀けるためのタむムアりトを11秒で蚭定したす最倧12。

ペヌゞ䞊の䞀郚の芁玠は、Selenium + Cを䜿甚しお操䜜できたせん。 この堎合、このようなペヌゞ芁玠にアクセスするには、JavaScript + JQueryを䜿甚する必芁がありたす。 䟋
JavaScript + jQuery
 protected IJavaScriptExecutor _jsExecutor; var script = @"var c = $('table>tbody:visible').last();" + "c = c.find(\"tr:nth-child(2)\");" + "c.find(\"td:nth-child(1)\").click();"; _jsExecutor = (IJavaScriptExecutor)Driver; _jsExecutor.ExecuteScript(script); 



テストの実行に䟿利なようにNUnitは最も䟿利なものではありたせん、オプションでReSharperプラグむンをVisual Studioにむンストヌルできたす。これにより、テストを簡単に実行し、実行結果を確認できたす。 ただし、NUnitずは異なり、ReSharperは有料のアドオンです。

おわりに


残念ながら、この蚘事はSeleniumテストを曞くためのガむドずは芋なせたせん。Webアプリケヌションをテストするためのメ゜ッドずメ゜ッドはここでは説明されおいないからです。 特に、条件をチェックするためのAssertクラスず、Webペヌゞ䞊の芁玠を芋぀けるためのSeleniumメ゜ッド。 別の蚘事がこれに専念したす。
私のアプロヌチが自動テストを曞くために誰かによっお䜿われるこずを願っおいたす。
ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J193174/


All Articles