t.me/atinfo_chat Telegram группа по автоматизации тестирования

Разбор и критика примера использования Selenium Webdriver + NUnit + C#


(Mykhailo Poliarush) #1

Вот вы, значит, сидите себе спокойно, кофе попиваете, на кнопочки кликаете, и тут к вам залетает ваш взмыленный руководить проекта/начальник/тим лид или генеральный директор и говорит:

Нам нужна автоматизация тестирования,
а то без нее никак, все развалится,
а будет – дадим тебе синьйора с бонусами!

Ну, значит, сидите вы после этого замотивированный то ли негативно, то ли позитивно, в общем – неважно, но важно то, что "работу-то нужно работать". Оглянулись вы по сторонам, а вокруг на проекте – Дикий Запад, в кого не плюнь, все на C# и .NET пишут. Да, и вы вспомнили, что когда-то то ли на C#, то ли на ASP.NET что-то делали. И совсем недавно какой-то слух прошел, что вышел Selenium Webdriver 2, который, говорят, лучше первой версии и все на нем, значит, автоматизацию и готовят. 

 Тут вы забиваете в Гуугл заклинание: selenium webdriver c# tutorial

Google поиск по словам selenium webdriver c# tutorial 

И получаете страницу вполне релевантных результатов, надеясь найти там хорошие примеры по автоматизации. Вот самая первая ссылка вполне подходит:  Selenium Two Tutorial using C#/NUnit and InternetExplorerDriver

В этой статье я хотел бы показать, как подключить Selenium  и написать первый тест. Все бы было хорошо, но! Обратите внимание на то, что пример этот показывает, как Селениум подключить и гугл автоматизировать, но этот пример не показывает, как правильно нужно тесты писать. Давайте рассмотрим этот пример теста более детально:

```c# using OpenQA.Selenium; using OpenQA.Selenium.IE;

using NUnit.Framework;

namespace Selenium.Two.DotNetExample
{
[TestFixture]
public class Test_Google
{
IWebDriver driver;

    [SetUp]
    public void Setup()
    {
        driver = new InternetExplorerDriver();
    }
    
    [TearDown]
    public void Teardown()
    {
        driver.Quit();
    }
        
    [Test]
    public void TestSearchGoogleForTheAutomatedTester()
    {
        //Navigate to the site
        driver.Navigate().GoToUrl("http://www.google.co.uk");
        //Find the Element and create an object so we can use it
        IWebElement queryBox = driver.FindElement(By.Name("q"));
        //Work with the Element that's on the page
        queryBox.SendKeys("The Automated Tester");
        queryBox.SendKeys(Keys.ArrowDown);
        queryBox.Submit();
        //Check that the Title is what we are expecting
        Assert.True(driver.Title.IndexOf("The Automated Tester") > -1);
    }
}

}


<p>Вот вы все подключили, и NUnit с Webdriver скачали:</p><p style="text-align: center;"><img src="http://2.bp.blogspot.com/-jlYXVrv0iao/TvO3rnNYvBI/AAAAAAAABIw/glrLhzL7tGc/s1600/automation-test.png" alt="NUnit + Selenium Webdriver; Visual Studio 2010" width="870" height="507" class="mceItem"></p><p>И даже тест в <a href="http://automated-testing.info/taxonomy/term/444/all" target="_blank">NUnit</a> запустили, и он даже прошел, но:</p><p style="text-align: center;"><img src="http://2.bp.blogspot.com/-TfPwD9Um58A/TvO3xq2MpJI/AAAAAAAABI8/NRO0AaF_UDw/s1600/nuinit-results.png" alt="NUnit test results" width="814" height="538" class="mceItem"></p><p>NUnit вам показывает какую-то фигню в ошибке:</p><blockquote><p>Selenium.Two.DotNetExample.Test_Google.TestSearchGoogleForTheAutomatedTester:<br><strong>Expected:</strong> True<br><strong>But was:</strong> False</p></blockquote><p>Значит, вы искали «The Automated Tester», а получили что-то другое? Отлично. А что? А что вы еще хотели от Assert.True, который служит для проверки булевых значений, а <strong>не для строк</strong>?</p><p>

//Check that the Title is what we are expecting
Assert.True(driver.Title.IndexOf(“The Automated Tester”) > -1);

</p><p> На этом можно было бы не заострять внимание, но если бы вы знали, сколько раз встречаешь в реальном коде именно такое… <br> Давайте сразу же исправим:</p><p>

//Check that the Title is what we are expecting
StringAssert.Contains(“The Automated Tester”, driver.Title);

</p><p> И получим следующий результат после теста:</p><p style="text-align: center;"><img src="http://3.bp.blogspot.com/-79koU1JBTI8/TvO4Cm4GTpI/AAAAAAAABJI/MWUS_6suKZs/s1600/nunit-result-2.png" alt="Результат теста в NUnit" width="814" height="538" class="mceItem"></p><p>Тест продолжает безнадежно валится, но давайте уже его допилим, и без лишних излишеств очень топорно поставим Sleep на 2 секунды. Что, конечно же, является <strong>огромной ошибкой</strong>, но для примера сойдет. Ведь <strong>пример – это игрушечный код</strong>.</p><p>

System.Threading.Thread.Sleep(2000);

//Check that the Title is what we are expecting
StringAssert.Contains(“The Automated Tester”, driver.Title);

using OpenQA.Selenium;
using OpenQA.Selenium.IE;

using NUnit.Framework;

namespace Selenium.Two.DotNetExample
{
[TestFixture]
public class Test_Google
{
IWebDriver driver;

    [SetUp]
    public void Setup()
    {
        driver = new InternetExplorerDriver();
    }

    [TearDown]
    public void Teardown()
    {
        driver.Quit();
    }

    public class GoogleSearchPage
    {
        IWebDriver drv;

        string DefaultUrl = "http://www.google.co.uk";

        public IWebElement QueryBox { get { return drv.FindElement(By.Name("q"));  } }

        public GoogleSearchPage(IWebDriver drv)
        {
            this.drv = drv;
        }

        public void Show()
        {
            Show(DefaultUrl);
        }

        public void Show(string url)
        {
            //Navigate to the site
            drv.Navigate().GoToUrl("http://www.google.co.uk");
        }

        public void Search(string searchPhrase)
        {
            Show();
            //Work with the Element that's on the page
            QueryBox.SendKeys("The Automated Tester");
            QueryBox.SendKeys(Keys.Enter);
            System.Threading.Thread.Sleep(2000);
        }
    }

    [Test]
    public void TestSearchGoogleForTheAutomatedTester()
    {
        string googleSearchPhrase = "The Automated Tester";
        var googlePage = new GoogleSearchPage();

        googlePage.Search(googleSearchPhrase);
        StringAssert.Contains(googleSearchPhrase, driver.Title);
    }
}

}

</p><h3><strong>Что случилось?&nbsp;</strong></h3><p>Появился класс 
<strong>GoogleSearchPage</strong>, который скрыл в себе все технические детали теста. Теперь этот класс можно использовать повторно и вынести в отдельный файл, чтобы глаза не мозолил.&nbsp;<br>&nbsp;Теперь наш тест не содержит деталей даже о том, что мы используем <a href="http://automated-testing.info/taxonomy/term/7/all" target="_blank">Selenium</a>. Там две строчки кода, которые просто объявляют переменные, одна строчка действия и одна проверка. <br><br>&nbsp;Ну хорошо, а что, если нам нужно написать второй тест кейс? Тогда наш код будет выглядеть так:</p><p>
    [Test]
    public void TestSearchGoogleForTheAutomatedTester()
    {
        string googleSearchPhrase = "The Automated Tester";
        var googlePage = new GoogleSearchPage(driver);

        googlePage.Search(googleSearchPhrase);
        StringAssert.Contains(googleSearchPhrase, driver.Title);
    }

    [Test]
    public void TestSearchGoogleForTheDZisIsATest()
    {
        string googleSearchPhrase = "DZis is a test";
        var googlePage = new GoogleSearchPage(driver);

        googlePage.Search(googleSearchPhrase);
        StringAssert.Contains(googleSearchPhrase.ToLower(), driver.Title.ToLower());
    }
</p><p>Вместо вот этого:</p><p>
```
        [Test]
        public void TestSearchGoogleForTheAutomatedTester()
        {
            //Navigate to the site
            driver.Navigate().GoToUrl("http://www.google.co.uk");
            //Find the Element and create an object so we can use it
            IWebElement queryBox = driver.FindElement(By.Name("q"));
            //Work with the Element that's on the page
            queryBox.SendKeys("The Automated Tester");
            queryBox.SendKeys(Keys.ArrowDown);
            queryBox.Submit();
            //Check that the Title is what we are expecting
            Assert.True(driver.Title.IndexOf("The Automated Tester") &gt; -1);
        }

        [Test]
        public void TestSearchGoogleForTheDZisIsATest()
        {
            //Navigate to the site
            driver.Navigate().GoToUrl("http://www.google.co.uk");
            //Find the Element and create an object so we can use it
            IWebElement queryBox = driver.FindElement(By.Name("q"));
            //Work with the Element that's on the page
            queryBox.SendKeys("DZis is a test");
            queryBox.SendKeys(Keys.ArrowDown);
            queryBox.Submit();
            //Check that the Title is what we are expecting
            Assert.True(driver.Title.IndexOf("DZis is a test") &gt; -1);
        }
```
</p><p style="text-align: center;"><img src='/uploads/default/1212/51fb0842a9943ad4.png' alt="2 Теста на Selenium Webdriver в NUnit" width="814" height="538" class="mceItem"></p><p>&nbsp;</p><p>Было бы глупо, если бы я был против простых примеров кода автоматизированного тестирования. Но я хочу подчеркнуть то, что код в примерах сознательно упрощен. Единственная цель примера кода c использованием &nbsp;<a href="http://automated-testing.info/taxonomy/term/7/all" target="_blank">Selenium</a> – показать вам, как вы можете кликать на кнопочки и вводить текст. Но не рассказать о том, как вам нужно правильно писать тесты.&nbsp;<br><br>&nbsp;Это приемлемо, когда у вас в одном тесте используются и детали о том, как Селениум должен найти кнопку, и сколько времени подождать, и какой идентификатор у чекбокса… Но когда у вас таких тестов 300? Что будет, если идентификатор одного элемента изменится, и чтобы все исправить, вам будет необходимо перелопатить 300 тестов? И это вместо того, чтобы вынести все в отдельное место, в отдельный класс. Ведь тогда вам будет необходимо изменить этот идентификатор лишь в одном месте.&nbsp;<br><br> Используйте примеры на здоровье, но не забывайте, что <strong>примеры кода – это игрушечный код</strong>.</p><p>q));
            //Work with the Element that</p>

(132u) #2

Здравствуйте!

Я новичок в тестировании, прочитала вашу статью, попыталась что-то сделать

После запсука теста получаю вот такую ошибку: "This assembly was not built with any known testing framework"

Подскажите пожалуйста  как это исправить??