Показаны сообщения с ярлыком автоматизация. Показать все сообщения
Показаны сообщения с ярлыком автоматизация. Показать все сообщения

суббота, сентября 21, 2013

Автохомяк: только ссылки, только хардкор, только автоматизация


Хомяк растет и развивается. Раньше он работал один, но очень быстро обрел популярность и новые ссылки потекли молочными реками. Решение было принято по Марксу – нанять еще одного хомяка.

Сейчас Автохомяк работает на портале AT.info, и уже успел опубликовать два еженедельных дайджеста интересных ссылок для автоматизаторов, которые посвящены только светлой, технической стороне тестирования.

Уже готово два выпуска:


И анонс со всеми деталями:
Да, и чуть не забыл! Автохомяк – открыт для ваших интересных ссылок. Так что если вы хотите видеть свежий дайджест с интересными ссылками по автоматизации тестирования – добавьте их! 

Я думаю, это будет полезно, если вы хотите анонсировать свои статьи, посты в блоге, проекты. Главное, чтобы материал нес ценность информативного характера и хоть как-то касался темы автоматизации тестирования и программирования. 

воскресенье, декабря 16, 2012

Confet&QA: Мой доклад про создание читабельных отчетов для автоматизации тестирования на .NET/C# + Webdriver + Gallio Icarus/MbUnit + BDDfy


Я хочу еще раз сказать спасибо Организаторам этой замечательной онлайн конференции – конфетки. Спасибо участникам, за ваши вопросы, на которые я отвечал в живую и на форуме software-testing.ru.

Мой доклад посвящен инструментам, помогающим сделать результаты прогона автоматизации более наглядными. Это Gallio + MbUnit, которые позволяют не только создавать и запускать тесты, но и создавать красивые отчеты после прохода автоматизации, записывать видео встроенными средствами и много другое.

Я рассказал о BDDfy – фреймворке, позволяющим писать тесты в более понятном и читабельном аля BDD-стиле. Именно в этом фреймвоке  я нашел решение тех проблем, которые у меня возникали со Specflow.

Но, на счет Gallio Icarus не обошлось и без полезной ложки дёгтя.
Перечитайте нашу переписку на форуме автоматизаторов с товарищем apetrovskiy. Александр очень хорошо расписывает возможные проблемы с Gallio и варианты их решения.



Ресурсы:
Gallio Icarus: http://gallio.org

BDDfy – фреймворк для БыДиДификации кода :)

Страница проекта на Github:
http://teststack.github.com/TestStack.BDDfy/

Описание на английском:
http://www.mehdi-khalili.com/bddify-in-action/introduction

И еще больше докладов с Конфетки в поиске по Ютубу.

суббота, декабря 15, 2012

XMLStarlet утилита для редактирования XML файлов из командной строки


Наконец-то нашел!

Зачем?
Иногда встречаются задачи, для решения которых необходимо модифицировать, удалить или добавить некоторые атрибуты в XML файле. 
Например, заменить connectionString в файле web.config и подобных конфигурационных файлах. 
Иногда мне приходится отслеживать изменения в XML фалах, а для этого их необходимо привести в более удобный вид. 

Решения
Я пишу скрипты на языке Perl, если необходимы более тонкие преобразования и работа с XML файлами. Для конфигурации билда перед запуском авто-тестов, у меня также есть подобные поиски и замены в файлах конфигурации на C#. Но, все это как-то заточено под конкретные файлы, и создавать универсальное решение не хотелось, но пришлось бы…

Пришлось бы, если бы я не нашел замечательный инструмент XMLStarlet, который позволяет редактировать, валидировать, запрашивать данные из XML фала через командную строку.
Со всеми возможностями инструмента я еще не разобрался, да и не надо пока. Главное, что я нашел, как заменить значения строки подключения к базе данных. А делается это так:

xml ed -u "configuration/connectionStrings/add[@name='SqlServerDb']/@connectionString" -v "Data Source=SQL2008;Initial Catalog=testdb93;User ID=admin;Password=admin;MultipleActiveResultSets=True;" My.Database.config

Создав несколько bat-файлов, я теперь могу быстро переключать приложение на разные базы данных.

Домашняя страница XMLStarlet
Страница загрузки

З.Ы: Внутри архива есть хорошее руководство пользователя

вторник, сентября 11, 2012

Бесплатные Вебинары по Selenium Webdriver с самого начала

Tarun Kumar, автор
Вебинаров по Selenium
На сайте «No Automated Testing», Tarun Kumar проводит бесплатные вебинары по Selenium Webdriver для начинающих. Примеры рассматриваются для платформы Java, с разбором работы не только Selenium IDE и Selenium Webdriver, но и достаточных основ объектно-ориентированного программирования на языке Java, с использованием сопутствующих инструментов тестирования.

Обучение ведется на английском языке, но, произношение тренера четкое и будет понятным для русскоязычных слушателей.

Инструкция для просмотра:

  1. Зайдите на страницу трейнингов: http://www.seleniumtests.com/p/free-selenium-training.html Выберете интересующий вебинар – вы перейдете по ссылке на советующий пост 
  2. В посте найдите ссылку на anymeeting и перейдите на этот сайт 
  3. На странице ввода пароля, введите – seleniumpassword 
  4. Имя и почту можно указать любые 


Выглядеть это должно так:


 На странице тренингов вы можете подписаться на следующие вебинары.
Все права на упомянутые материалы принадлежат их автору – Tarun Kumar. При возникновении вопросов – свяжитесь с ним лично.

пятница, декабря 23, 2011

О вреде неправильных (всех!) примеров кода автоматизации тестирования

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

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

Ну, значит, сидите вы после этого замотивированный толи негативно, толи позитивно, в общем – неважно, но важно то, что работу то нужно работать.

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

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



И получаете страницу вполне релевантных результатов, надеясь найти там хорошие примеры по автоматизации.

Вот самая первая ссылка вполне подходит:

http://www.theautomatedtester.co.uk/tutorials/selenium/selenium_two_csharp_nunit.htm

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

Давайте рассмотрим этот пример теста более детально:

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);
        }
    }
}

Вот вы все подключили, и NUnit с Webdriver скачали:

И даже тест в NUnit запустили, и он даже прошел, но:


NUnit вам показывает какую-то фигню в ошибке:


Selenium.Two.DotNetExample.Test_Google.TestSearchGoogleForTheAutomatedTester:
Expected: True
But was: False


Значит, вы искали «The Automated Tester», а получили что-то другое? Отлично. А что? А что вы еще хотели от Assert.True, который служит для проверки булевых значений, а не для строк?

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

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

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


И получим следующий результат после теста:



Тест продолжает безнадежно валится, но давайте уже его допилим, и без лишних излишеств очень топорно поставим Sleep на 2 секунды. Что, конечно же, является огромной ошибкой, но для примера сойдет. Ведь пример – это игрушечный код.

System.Threading.Thread.Sleep(2000);

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


Да, сейчас NUnit выдает более понятную ошибку:
Selenium.Two.DotNetExample.Test_Google.TestSearchGoogleForTheAutomatedTester:
Expected: String containing "The Automated Tester"
But was: "the automated tester - Поиск в Google"


И эта ошибка говорит, что, с учетом регистра символов, строка "The Automated Tester" не была найдена в строке "the automated tester - Поиск в Google".

Можете сами попробовать. Сейчас Google, при поиске, помещает в свой заголовок поисковую фразу в нижнем регистре символов. Я считаю, что это бага, и обязательно напишу репорт в Гуугл.

А вот теперь давайте подумаем над следующим вопросом:
Сколько в этом тесте тестового кода? То есть, кода, который что-то тестирует?
Сходу можно ответить: Да ты что, тут весь код тестовый, это же тест!

Да?! А давайте этот тест немного порефакторим:

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);
        }
    }
}

Что случилось?
Появился класс, который скрыл в себе все технические детали теста. Теперь этот класс можно использовать повторно и вынести в отдельный файл, чтобы глаза не мозолил.
Теперь на тест не содержит деталей даже о том, что мы используем Selenium. Там две строчки кода, которые просто объявляют переменные, одна строчка действия и одна проверка.

Ну, хорошо, а что если нам нужно написать второй тест кейс?
Тогда наш код будет выглядеть так:

[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());
        }

Вместо вот этого:

[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);
        }

        [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") > -1);
        }



Было бы глупо, если бы я был против простых примеров кода автоматизированного тестирования.

Но, я хочу подчеркнуть то, что код в примерах сознательно упрощен. Единственна я цель примера кода c использованием Selenium – это показать то, как вы можете кликать на кнопочки и вводить текст. Но не, рассказать о том, как вам нужно правильно писать тесты.

Это приемлемо, когда у вас в одном тесте используются, и детали о том как Селениум должен найти кнопку, и сколько времени подождать и какой идентификатор у чекбокса…

Но, когда у вас таких тестов 300? Что будет, если идентификатор одного элемента изменится, и чтобы все исправить вам будет необходимо перелопать 300 тестов? И это вместо того чтобы вынести все в отдельное место, в отдельный класс. Ведь тогда вам будет необходимо изменить этот идентификатор лишь в одном месте.

Используйте примеры на здоровье, но не забывайте, что примеры кода – это игрушечный код.