SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
Висновки з TDD
погляд початківця
Трішки лірики про процес
Приклад реалізації тесту
Віталій Зінченко
zinchenko.vitaliy@gmail.com
Чому виникло бажання про це розповісти?
Подяки:
• http://xpinjection.com
• Микола Аліменков
• Володимир Цукур
• Einar Ingebrigtsen
• Jasson Huggins
• Simon Steward
Робочий процес
розробника
 аналіз вимог
 виділення неподільних елементів
 визначення вхідних параметрів і результату
 розробка функціоналу
 перевірка
 створення тестової версії
 виправлення помилок
Робочий процес
тестувальника
 аналіз вимог
 виділення неподільних елементів
 визначення вхідних параметрів і результату
 розробка тестових сценаріїв
 перевірка тестової версії
 звітування про помилки
Що тут не так?
Давайте вирішувати проблеми, ще до їх появи
 ізольований аналіз вимог та їх уточнення
 питання - як воно працює?
 питання - як воно перевіряється?
Результат:
 багато дрібних помилок
 уточнення після реалізації
 витрачений час
Єдина задача - єдина команда
Реалізація пліч-о-пліч:
 аналіз і уточнення вимог
 виділення функціональних частин
 створення макету продукту
 реалізація функціоналу
 написання і розробка тестів
 збереження робочих даних в одному місці
І ми маємо отаке:
Перевірки при такому підході
 менше запитань і узгоджень після реалізації
 менше помилок-багів
 розробник використовує тести в процесі написання
функціоналу
 тестувальник займається створенням тестів, а не їх
проходженням
 частіші та однакові регресивні перевірки
Як це все виглядає:
Unit Test, Visual Studio 2012 + NuGet
WebDriver + Selenium
Клас BaseObject
using OpenQA.Selenium;
using Selenium;
Using OpenQA.Selenium.Support.PageObjects;
Using OpenQA.Selenium.Support.UI;
namespace FaceBookTest
{
public class BaseObject
{
public static IWebDriver Driver;
public static DefaultSelenium Selenium;
public static void InitPage<T>(T pageClass) where T : BaseObject
{
PageFactory.InitElements(Driver, pageClass);
}
}
}
Клас BaseTest
using Nunit.Framework; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.IE;
using OpenQA.Selenium.Chrome; using Selenium;
namespace FaceBookTest
{ public class BaseTest : BaseObject
{
[TestFixtureSetUp]
public void beforeClass(){
Driver = new FirefoxDriver();
//for IE Driver = new InternetExplorerDriver(@"<DOWNLOAD AND SPECIGY PATH
//TO IEDERIVERSERVER HERE(//code.google.com/p/selenium)>");
Selenium = new WebDriverBackedSelenium(Driver, TestTools.homePage);
Selenium.Start()
}
[SetUp]
public void beforeTest(){
Driver.Navigate().GoToUrl(TestTools.homePage);
}
[TestFixtureTearDown]
public void afterClass(){
Driver.Close();
Selenium.Close();
} } }
Клас TestTools
using NUnit.Framework;
namespace FaceBookTest
{ class TestTools : BaseObject
{
public static string homePage = "http://www.facebook.com";
private const int DEFAULT_TIMEOUT = 60;
public static void WaitingForElement(string locator, int timeOut =
DEFAULT_TIMEOUT) {
for (int i = 0; i < timeOut; i++){
if (Selenium.IsElementPresent(locator)){
return;
}
else{
System.Threading.Thread.Sleep(1000);
}
}
Assert.Fail("Element with '" + locator + "' not found");
} } }
Елементи на Login-сторінці
public class LoginPage : BaseObject
public const string USER_NAME_FIELD = "//input[@id='email']";
public const string PASSWORD_FIELD = "//input[@id='pass']";
public const string LOGIN_BUTTON = "//label[@id='loginbutton']/input";
public const string FAILED_LOGIN_TEXT = "//div/p[contains(text(),'The password
you entered is incorrect')]";
[FindsBy(How = How.XPath,Using = USER_NAME_FIELD)]
public IWebElement userNameField;
[FindsBy(How = How.XPath, Using = PASSWORD_FIELD)]
public IWebElement passwordField;
[FindsBy(How = How.XPath, Using = LOGIN_BUTTON)]
public IWebElement loginButton;
Події на Login-сторінці
public static LoginPage GetLoginPage() {
LoginPage loginPage = new LoginPage();
InitPage(loginPage);
return loginPage; }
public LoginPage EnterUserName(string userName){
userNameField.SendKeys(userName);
return GetLoginPage(); }
public LoginPage EnterPassword(string password){
passwordField.SendKeys(password);
return GetLoginPage(); }
public UserHomePage ClickLoginButton() {
loginButton.Click();
return UserHomePage.GetUserHomePage(); }
public LoginPage IsLoginFailed(){
TestTools.WaitingForElement(FAILED_LOGIN_TEXT);
return GetLoginPage();}
Тестові методи для Login-сторінки
namespace FaceBookTest
{ class LoginPageTools
{ private LoginPage loginPage = new LoginPage();
private UserHomePage userHomePage = new UserHomePage();
public LoginPageTools AssertUserName(string userName){
UserHomePage.AssertUserName(userName);
return this; } }
public LoginPageTools AssertLoginFailed(){
loginPage.IsLoginFailed();
return this;}
public LoginPageTools PleaseLogin(string userName, string password){
BaseObject.InitPage(loginPage);
loginPage.
EnterUserName(userName).
EnterPassword(password).
ClickLoginButton();
return this;
} } }
Елементи та події на HomePage
public const string DISPLAYED_USER_NAME =
"//img[contains(@id,'profile_pic_header')]/../span[contains(text(),'#')]";
public const string USER_NAVIGATION_MENU = "//*[@id='userNavigationLabel']";
public const string LOGOUT_BUTTON = "//input[@value='Log Out']";
[FindsBy(How = How.XPath, Using = USER_NAVIGATION_MENU)]
public IWebElement userNavigationMenu;
[FindsBy(How = How.XPath, Using = LOGOUT_BUTTON)]
public IWebElement logoutButton;
public static UserHomePage GetUserHomePage(){
UserHomePage userHomePage = new UserHomePage();
InitPage(userHomePage);
return userHomePage;
}
public UserHomePage AssertUserName(string testUserName){
TestTools.WaitingForElement(DISPLAYED_USER_NAME.Replace("#",
testUserName));
return GetUserHomePage();
}
Тестові методи для HomePage
namespace FaceBookTest
{
class UserHomePageTools
{
private UserHomePage userHomePage = new UserHomePage();
public UserHomePageTools PleaseLogOut()
{
BaseObject.InitPage(userHomePage);
userHomePage.userNavigationMenu.Click();
userHomePage.logoutButton.Click();
return this;
}
}
}
Тест
namespace FaceBookTest
{ public class LoginPageTest : BaseTest
{
private static LoginPageTools loginPageTools = new LoginPageTools();
private static UserHomePageTools userHomePageTools = new
UserHomePageTools();
[Test]
public static void UserIsAbbleToLogin(){
loginPageTools.
PleaseLogin(“fbuser@mail.com”, “fb!password13”).
AssertUserName(“FBtest User”);
UserHomePageTools.PleaseLogOut();
}
[Test]
public static void UserIsNotAbbleToLogin(){
PleaseLogin(“fbuser@mail.com”, “incorrectPassword”).
AssertLoginFailed();
}
}
}
Результати
SpecFlow
Додати в проект:
 SpecFlow
 SpecFlow.NUnit
Створити SpecFlow Feature File
Код тесту
namespace FaceBookTest
{ [Binding]
public class LoginFeatureSteps : BaseTest
{ private static LoginPageTools loginPageTools = new LoginPageTools();
private static UserHomePageTools userHomePageTools = new
UserHomePageTools();
[AfterScenario()]
public void TearDown()
{ afterClass(); }
[Given(@"FaceBook Login Page is opened")]
public void GivenFaceBookLoginPageIsOpened()
{ specFlowInit();}
[When(@"Enter credentials (.*)/(.*) and press Login button")]
public void WhenEnterCredentialsAndPressLogin(string p0, string p1)
{ loginPageTools.PleaseLogin(p0, p1); }
[Then(@"User Name (.*) is displayed on the Home Page")]
public void ThenUserNameIsDisplayedOnTheHomePage(string p0)
{ loginPageTools.AssertUserName(p0);
userHomePageTools.PleaseLogOut(); }
} }
Додати в BaseTest.сs
public void specFlowInit()
{beforeClass();
beforeTest();}
Результати
//
07 -  vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013 (5)

Mais conteúdo relacionado

Semelhante a 07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013 (5)

МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...GoQA
 
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)Exoft LLC
 
Lec11 користувацькi елементи керування
Lec11 користувацькi елементи керуванняLec11 користувацькi елементи керування
Lec11 користувацькi елементи керуванняcit-cit
 
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2GoQA
 
IT Talks Автоматизація тестування з допомогою Selenium
IT Talks Автоматизація тестування з допомогою SeleniumIT Talks Автоматизація тестування з допомогою Selenium
IT Talks Автоматизація тестування з допомогою SeleniumVadym Muliavka
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021OdessaJS Conf
 
O.Posyniak - UI Components
O.Posyniak - UI ComponentsO.Posyniak - UI Components
O.Posyniak - UI ComponentsOleg Posyniak
 
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...Igor Bronovskyy
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
Phpunit модульне тестування
Phpunit модульне тестуванняPhpunit модульне тестування
Phpunit модульне тестуванняVladimir Maslechkin
 
Тестування з допомогою PHPUnit
Тестування з допомогою PHPUnitТестування з допомогою PHPUnit
Тестування з допомогою PHPUnitAndriy Nasinnyk
 

Semelhante a 07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013 (5) (20)

Design patterns part 2
Design patterns part 2Design patterns part 2
Design patterns part 2
 
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
МИХАЙЛО БОДНАРЧУК «Як перестати боятись та полюбити автотести на JavaScript» ...
 
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Unit Testing by Pavlo Serdyuk (UKR)
 
Lec11 користувацькi елементи керування
Lec11 користувацькi елементи керуванняLec11 користувацькi елементи керування
Lec11 користувацькi елементи керування
 
Tdd, ти де?
Tdd, ти де?Tdd, ти де?
Tdd, ти де?
 
ASP.Net MVC
ASP.Net MVCASP.Net MVC
ASP.Net MVC
 
cpp-2013 #16 Automated testing
cpp-2013 #16 Automated testingcpp-2013 #16 Automated testing
cpp-2013 #16 Automated testing
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Twig in symfony
Twig in symfonyTwig in symfony
Twig in symfony
 
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2
СЕРГІЙ БРИТ «Selenide + Playwright = unite and rule» Online QADay 2022 #2
 
IT Talks Автоматизація тестування з допомогою Selenium
IT Talks Автоматизація тестування з допомогою SeleniumIT Talks Автоматизація тестування з допомогою Selenium
IT Talks Автоматизація тестування з допомогою Selenium
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
 
O.Posyniak - UI Components
O.Posyniak - UI ComponentsO.Posyniak - UI Components
O.Posyniak - UI Components
 
cpp-2013 #20 Best practices
cpp-2013 #20 Best practicescpp-2013 #20 Best practices
cpp-2013 #20 Best practices
 
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it...
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
Phpunit модульне тестування
Phpunit модульне тестуванняPhpunit модульне тестування
Phpunit модульне тестування
 
Clean code (UA)
Clean code (UA)Clean code (UA)
Clean code (UA)
 
ASP.Net basics
ASP.Net basics ASP.Net basics
ASP.Net basics
 
Тестування з допомогою PHPUnit
Тестування з допомогою PHPUnitТестування з допомогою PHPUnit
Тестування з допомогою PHPUnit
 

Último

Імідж викладача ЗВО та шляхи його формування.pptx
Імідж викладача ЗВО та шляхи його формування.pptxІмідж викладача ЗВО та шляхи його формування.pptx
Імідж викладача ЗВО та шляхи його формування.pptxkatral1968
 
Kryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenKryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenolha1koval
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdfssuser54595a
 
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxAlexanderSholk
 
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxПрезентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxssuserc6cee7
 
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейЧеркаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейvitaliyinformatik
 
Критерії самоцінювання Іноземні мови.pdf
Критерії самоцінювання  Іноземні мови.pdfКритерії самоцінювання  Іноземні мови.pdf
Критерії самоцінювання Іноземні мови.pdfolha1koval
 
ніцше філософські погляди та бачення2.0.pptx
ніцше філософські погляди та бачення2.0.pptxніцше філософські погляди та бачення2.0.pptx
ніцше філософські погляди та бачення2.0.pptxBodia2
 
критерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfкритерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfolha1koval
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxvitalina6709
 
освітня програма 2023-2024 .
освітня програма  2023-2024                    .освітня програма  2023-2024                    .
освітня програма 2023-2024 .zaskalko111
 
Луцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxЛуцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxhome
 
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...Чернівецька обласна бібліотека для дітей
 
Роберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаРоберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаAdriana Himinets
 
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін НБУ для дітей
 

Último (17)

17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
 
Імідж викладача ЗВО та шляхи його формування.pptx
Імідж викладача ЗВО та шляхи його формування.pptxІмідж викладача ЗВО та шляхи його формування.pptx
Імідж викладача ЗВО та шляхи його формування.pptx
 
Kryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenKryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnen
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23_FINAL-1.pdf
 
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
 
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxПрезентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
 
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейЧеркаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
 
Критерії самоцінювання Іноземні мови.pdf
Критерії самоцінювання  Іноземні мови.pdfКритерії самоцінювання  Іноземні мови.pdf
Критерії самоцінювання Іноземні мови.pdf
 
ніцше філософські погляди та бачення2.0.pptx
ніцше філософські погляди та бачення2.0.pptxніцше філософські погляди та бачення2.0.pptx
ніцше філософські погляди та бачення2.0.pptx
 
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
 
критерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfкритерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdf
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptx
 
освітня програма 2023-2024 .
освітня програма  2023-2024                    .освітня програма  2023-2024                    .
освітня програма 2023-2024 .
 
Луцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxЛуцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptx
 
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...
Знайомтесь: книжкові бестселери: інформаційна книжкова візитка. Рекомендаційн...
 
Роберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаРоберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантаста
 
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін
Проєкт «ІТ.UA: народжені в Україні». Єгор Анчишкін
 

07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013 (5)

  • 1. Висновки з TDD погляд початківця Трішки лірики про процес Приклад реалізації тесту Віталій Зінченко zinchenko.vitaliy@gmail.com
  • 2. Чому виникло бажання про це розповісти? Подяки: • http://xpinjection.com • Микола Аліменков • Володимир Цукур • Einar Ingebrigtsen • Jasson Huggins • Simon Steward
  • 3. Робочий процес розробника  аналіз вимог  виділення неподільних елементів  визначення вхідних параметрів і результату  розробка функціоналу  перевірка  створення тестової версії  виправлення помилок
  • 4. Робочий процес тестувальника  аналіз вимог  виділення неподільних елементів  визначення вхідних параметрів і результату  розробка тестових сценаріїв  перевірка тестової версії  звітування про помилки
  • 5. Що тут не так? Давайте вирішувати проблеми, ще до їх появи  ізольований аналіз вимог та їх уточнення  питання - як воно працює?  питання - як воно перевіряється? Результат:  багато дрібних помилок  уточнення після реалізації  витрачений час
  • 6. Єдина задача - єдина команда Реалізація пліч-о-пліч:  аналіз і уточнення вимог  виділення функціональних частин  створення макету продукту  реалізація функціоналу  написання і розробка тестів  збереження робочих даних в одному місці
  • 7. І ми маємо отаке:
  • 8. Перевірки при такому підході  менше запитань і узгоджень після реалізації  менше помилок-багів  розробник використовує тести в процесі написання функціоналу  тестувальник займається створенням тестів, а не їх проходженням  частіші та однакові регресивні перевірки
  • 9. Як це все виглядає: Unit Test, Visual Studio 2012 + NuGet WebDriver + Selenium
  • 10. Клас BaseObject using OpenQA.Selenium; using Selenium; Using OpenQA.Selenium.Support.PageObjects; Using OpenQA.Selenium.Support.UI; namespace FaceBookTest { public class BaseObject { public static IWebDriver Driver; public static DefaultSelenium Selenium; public static void InitPage<T>(T pageClass) where T : BaseObject { PageFactory.InitElements(Driver, pageClass); } } }
  • 11. Клас BaseTest using Nunit.Framework; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.IE; using OpenQA.Selenium.Chrome; using Selenium; namespace FaceBookTest { public class BaseTest : BaseObject { [TestFixtureSetUp] public void beforeClass(){ Driver = new FirefoxDriver(); //for IE Driver = new InternetExplorerDriver(@"<DOWNLOAD AND SPECIGY PATH //TO IEDERIVERSERVER HERE(//code.google.com/p/selenium)>"); Selenium = new WebDriverBackedSelenium(Driver, TestTools.homePage); Selenium.Start() } [SetUp] public void beforeTest(){ Driver.Navigate().GoToUrl(TestTools.homePage); } [TestFixtureTearDown] public void afterClass(){ Driver.Close(); Selenium.Close(); } } }
  • 12. Клас TestTools using NUnit.Framework; namespace FaceBookTest { class TestTools : BaseObject { public static string homePage = "http://www.facebook.com"; private const int DEFAULT_TIMEOUT = 60; public static void WaitingForElement(string locator, int timeOut = DEFAULT_TIMEOUT) { for (int i = 0; i < timeOut; i++){ if (Selenium.IsElementPresent(locator)){ return; } else{ System.Threading.Thread.Sleep(1000); } } Assert.Fail("Element with '" + locator + "' not found"); } } }
  • 13. Елементи на Login-сторінці public class LoginPage : BaseObject public const string USER_NAME_FIELD = "//input[@id='email']"; public const string PASSWORD_FIELD = "//input[@id='pass']"; public const string LOGIN_BUTTON = "//label[@id='loginbutton']/input"; public const string FAILED_LOGIN_TEXT = "//div/p[contains(text(),'The password you entered is incorrect')]"; [FindsBy(How = How.XPath,Using = USER_NAME_FIELD)] public IWebElement userNameField; [FindsBy(How = How.XPath, Using = PASSWORD_FIELD)] public IWebElement passwordField; [FindsBy(How = How.XPath, Using = LOGIN_BUTTON)] public IWebElement loginButton;
  • 14. Події на Login-сторінці public static LoginPage GetLoginPage() { LoginPage loginPage = new LoginPage(); InitPage(loginPage); return loginPage; } public LoginPage EnterUserName(string userName){ userNameField.SendKeys(userName); return GetLoginPage(); } public LoginPage EnterPassword(string password){ passwordField.SendKeys(password); return GetLoginPage(); } public UserHomePage ClickLoginButton() { loginButton.Click(); return UserHomePage.GetUserHomePage(); } public LoginPage IsLoginFailed(){ TestTools.WaitingForElement(FAILED_LOGIN_TEXT); return GetLoginPage();}
  • 15. Тестові методи для Login-сторінки namespace FaceBookTest { class LoginPageTools { private LoginPage loginPage = new LoginPage(); private UserHomePage userHomePage = new UserHomePage(); public LoginPageTools AssertUserName(string userName){ UserHomePage.AssertUserName(userName); return this; } } public LoginPageTools AssertLoginFailed(){ loginPage.IsLoginFailed(); return this;} public LoginPageTools PleaseLogin(string userName, string password){ BaseObject.InitPage(loginPage); loginPage. EnterUserName(userName). EnterPassword(password). ClickLoginButton(); return this; } } }
  • 16. Елементи та події на HomePage public const string DISPLAYED_USER_NAME = "//img[contains(@id,'profile_pic_header')]/../span[contains(text(),'#')]"; public const string USER_NAVIGATION_MENU = "//*[@id='userNavigationLabel']"; public const string LOGOUT_BUTTON = "//input[@value='Log Out']"; [FindsBy(How = How.XPath, Using = USER_NAVIGATION_MENU)] public IWebElement userNavigationMenu; [FindsBy(How = How.XPath, Using = LOGOUT_BUTTON)] public IWebElement logoutButton; public static UserHomePage GetUserHomePage(){ UserHomePage userHomePage = new UserHomePage(); InitPage(userHomePage); return userHomePage; } public UserHomePage AssertUserName(string testUserName){ TestTools.WaitingForElement(DISPLAYED_USER_NAME.Replace("#", testUserName)); return GetUserHomePage(); }
  • 17. Тестові методи для HomePage namespace FaceBookTest { class UserHomePageTools { private UserHomePage userHomePage = new UserHomePage(); public UserHomePageTools PleaseLogOut() { BaseObject.InitPage(userHomePage); userHomePage.userNavigationMenu.Click(); userHomePage.logoutButton.Click(); return this; } } }
  • 18. Тест namespace FaceBookTest { public class LoginPageTest : BaseTest { private static LoginPageTools loginPageTools = new LoginPageTools(); private static UserHomePageTools userHomePageTools = new UserHomePageTools(); [Test] public static void UserIsAbbleToLogin(){ loginPageTools. PleaseLogin(“fbuser@mail.com”, “fb!password13”). AssertUserName(“FBtest User”); UserHomePageTools.PleaseLogOut(); } [Test] public static void UserIsNotAbbleToLogin(){ PleaseLogin(“fbuser@mail.com”, “incorrectPassword”). AssertLoginFailed(); } } }
  • 20. SpecFlow Додати в проект:  SpecFlow  SpecFlow.NUnit Створити SpecFlow Feature File
  • 21. Код тесту namespace FaceBookTest { [Binding] public class LoginFeatureSteps : BaseTest { private static LoginPageTools loginPageTools = new LoginPageTools(); private static UserHomePageTools userHomePageTools = new UserHomePageTools(); [AfterScenario()] public void TearDown() { afterClass(); } [Given(@"FaceBook Login Page is opened")] public void GivenFaceBookLoginPageIsOpened() { specFlowInit();} [When(@"Enter credentials (.*)/(.*) and press Login button")] public void WhenEnterCredentialsAndPressLogin(string p0, string p1) { loginPageTools.PleaseLogin(p0, p1); } [Then(@"User Name (.*) is displayed on the Home Page")] public void ThenUserNameIsDisplayedOnTheHomePage(string p0) { loginPageTools.AssertUserName(p0); userHomePageTools.PleaseLogOut(); } } } Додати в BaseTest.сs public void specFlowInit() {beforeClass(); beforeTest();}