SlideShare a Scribd company logo
1 of 30
HOW TO START
TEST AUTOMATION
KANSTANTSIN HARBACHOU
JUNE 20, 2019
2
AGENDA
START TEST AUTOMATION
1. Critical aspects
2. Typical mistakes
3. Programming approaches
4. Review of existing tools
5. Q&A
CRITICAL
ASPECTS
Infrastructure, language, CI
4
HOW TO CHOOSE TOOLS?
START TEST AUTOMATION
5
WHICH PROGRAMMING LANGUAGE
TO CHOOSE
START TEST AUTOMATION
Project
Experience
Functionality
System under test
…
6
HOW TO RUN TESTS?
START TEST AUTOMATION
7
WHERE WILL WE RUN?
START TEST AUTOMATION
8
PROBLEMS?
START TEST AUTOMATION
9
PROBLEMS?
START TEST AUTOMATION
TYPICAL
MISTAKES
TAF lifecycle
11
DON’T UPSET UNCLE BOB
START TEST AUTOMATION
12
TYPICAL MISTAKES
START TEST AUTOMATION
Overengineering
Difficult maintenance
All at once
Hipster’s approach
PROGRAMMING
APPROACHES
Principles, patterns
14
PROGRAMMING APPROACHES
START TEST AUTOMATION
15
PRINCIPLES
START TEST AUTOMATION
KISS
YAGNI
SOLID
16
KISS
START TEST AUTOMATION
17
YAGNI
START TEST AUTOMATION
18
SOLID
START TEST AUTOMATION
19
PATTERNS
START TEST AUTOMATION
Singleton
Builder
Fabric
Decorator
20
SINGLETON
START TEST AUTOMATION
using System;
namespace Singleton
{
class Singleton
{
private Singleton() { }
private static Singleton _instance;
public static Singleton GetInstance()
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
public static void SomeBusinessLogic()
{ // ... }
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("Singleton works, both variables contain the same instance.");
}
else
{
Console.WriteLine("Singleton failed, variables contain different instances.");
}
}
}
}
21
SINGLETON
START TEST AUTOMATION
22
BUILDER
START TEST AUTOMATION
public interface IBuilder
{
void BuildPartA();
void BuildPartB();
void BuildPartC();
}
public class ConcreteBuilder : IBuilder
{
private Product _product = new Product();
public ConcreteBuilder()
{
this.Reset();
}
public void Reset()
{
this._product = new Product();
}
public void BuildPartA()
{
this._product.Add("PartA1");
}
public void BuildPartB()
{
this._product.Add("PartB1");
}
public void BuildPartC()
{
this._product.Add("PartC1");
}
public Product GetProduct()
{
Product result = this._product;
this.Reset(); return result;
}
}
public class Product
{
private List<object> _parts = new List<object>();
public void Add(string part)
{
this._parts.Add(part);
}
public string ListParts()
{
string str = string.Empty;
for (int i = 0; i < this._parts.Count; i++)
{
str += this._parts[i] + ", ";
}
str = str.Remove(str.Length - 2);
return "Product parts: " + str + "n";
}
}
public class Director
{
private IBuilder _builder;
public IBuilder Builder
{
set { _builder = value; }
}
public void BuildMinimalViableProduct()
{
this._builder.BuildPartA();
}
public void BuildFullFeaturedProduct()
{
this._builder.BuildPartA();
this._builder.BuildPartB();
this._builder.BuildPartC();
}
}
class Program
{
static void Main(string[] args)
{
var director = new Director();
var builder = new ConcreteBuilder();
director.Builder = builder;
Console.WriteLine("Standard basic product:");
director.BuildMinimalViableProduct();
Console.WriteLine(builder.GetProduct().ListParts());
Console.WriteLine("Standard full featured product:");
director.BuildFullFeaturedProduct();
Console.WriteLine(builder.GetProduct().ListParts());
Console.WriteLine("Custom product:");
builder.BuildPartA();
builder.BuildPartC();
Console.Write(builder.GetProduct().ListParts());
}
}
Standard basic product:
Product parts: PartA1
Standard full featured product:
Product parts: PartA1, PartB1, PartC1
Custom product:
Product parts: PartA1, PartC1
23
BUILDER
START TEST AUTOMATION
24
FABRIC
START TEST AUTOMATION
public static class WebDriverFactory
{
public static IWebDriver CreateWebDriver(WebBrowser name)
{
switch (name)
{
case WebBrowser.Firefox:
return new FirefoxDriver();
case WebBrowser.IE:
case WebBrowser.InternetExplorer:
InternetExplorerOptions ieOption = new InternetExplorerOptions();
ieOption.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
ieOption.EnsureCleanSession = true;
ieOption.RequireWindowFocus = true;
return new InternetExplorerDriver(@"./", ieOption);
case "safari":
return new RemoteWebDriver(new Uri("http://mac-ip-address:the-opened-port"), DesiredCapabilities.Safari());
case WebBrowser.Chrome:
default:
ChromeOptions chromeOption = new ChromeOptions();
string location = @"./";
chromeOption.AddArguments("--disable-extensions");
return new ChromeDriver(location, chromeOption);
}
}
}
public enum WebBrowser
{
IE,
InternetExplorer,
Firefox,
Chrome
}
var driver = WebDriverFactory.CreateWebDriver(WebBrowser.Chrome);
25
FABRIC
START TEST AUTOMATION
26
DECORATOR
START TEST AUTOMATION
public abstract class Component
{
public abstract string Operation();
}
class ConcreteComponent : Component
{
public override string Operation()
{
return "ConcreteComponent";
}
}
abstract class Decorator : Component
{
protected Component _component;
public Decorator(Component component)
{
this._component = component;
}
public void SetComponent(Component component)
{
this._component = component;
}
public override string Operation()
{
if (this._component != null)
{
return this._component.Operation();
}
else
{
return string.Empty;
}
}
}
class ConcreteDecoratorA : Decorator
{
public ConcreteDecoratorA(Component comp) : base(comp)
{ }
public override string Operation()
{
return $"ConcreteDecoratorA({base.Operation()})";
}
}
class ConcreteDecoratorB : Decorator
{
public ConcreteDecoratorB(Component comp) : base(comp)
{ }
public override string Operation()
{
return $"ConcreteDecoratorB({base.Operation()})";
}
}
public class Client
{
public void ClientCode(Component component)
{
Console.WriteLine("RESULT: " + component.Operation());
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client();
var simple = new ConcreteComponent();
Console.WriteLine("Client: I get a simple component:");
client.ClientCode(simple);
Console.WriteLine();
ConcreteDecoratorA decorator1 =
new ConcreteDecoratorA(simple);
ConcreteDecoratorB decorator2 =
new ConcreteDecoratorB(decorator1);
Console.WriteLine("Client: Now I've got a decorated
component:");
client.ClientCode(decorator2);
}
}
Client: I get a simple component:
RESULT: ConcreteComponent
Client: Now I've got a decorated component:
RESULT:
ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
27
DECORATOR
START TEST AUTOMATION
REVIEW OF
EXISTING TOOLS
Wrappers
29
WRAPPERS
START TEST AUTOMATION
Q & A

More Related Content

What's hot

Oracle Forms Performance Testing PushToTest TestMaker JAT
Oracle Forms Performance Testing PushToTest TestMaker JATOracle Forms Performance Testing PushToTest TestMaker JAT
Oracle Forms Performance Testing PushToTest TestMaker JATClever Moe
 
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFTRFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFTYogindernath Gupta
 
Inverting The Testing Pyramid
Inverting The Testing PyramidInverting The Testing Pyramid
Inverting The Testing PyramidNaresh Jain
 
What is Agile Testing?
What is Agile Testing?What is Agile Testing?
What is Agile Testing?vodQA
 
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...Yogindernath Gupta
 
Introduction to Unit Testing
Introduction to Unit TestingIntroduction to Unit Testing
Introduction to Unit TestingMike Pearce
 

What's hot (10)

Test Strategy
Test StrategyTest Strategy
Test Strategy
 
Oracle Forms Performance Testing PushToTest TestMaker JAT
Oracle Forms Performance Testing PushToTest TestMaker JATOracle Forms Performance Testing PushToTest TestMaker JAT
Oracle Forms Performance Testing PushToTest TestMaker JAT
 
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFTRFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
RFT Tutorial 4 How Do We Record A Script Using Rational Functional Tester - RFT
 
Inverting The Testing Pyramid
Inverting The Testing PyramidInverting The Testing Pyramid
Inverting The Testing Pyramid
 
Rft courseware
Rft coursewareRft courseware
Rft courseware
 
What is Agile Testing?
What is Agile Testing?What is Agile Testing?
What is Agile Testing?
 
Test Automation Pyramid
Test Automation PyramidTest Automation Pyramid
Test Automation Pyramid
 
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
RFT Tutorial - 9 How To Create A Properties Verification Point In Rft For Tes...
 
User story voyage
User story voyageUser story voyage
User story voyage
 
Introduction to Unit Testing
Introduction to Unit TestingIntroduction to Unit Testing
Introduction to Unit Testing
 

Similar to How to Start Test Automation

What is the best approach to tdd
What is the best approach to tddWhat is the best approach to tdd
What is the best approach to tddLuca Mattia Ferrari
 
Susan windsor soft test 16th november 2005
Susan windsor soft test   16th november 2005Susan windsor soft test   16th november 2005
Susan windsor soft test 16th november 2005David O'Dowd
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appiumGaurav Singh
 
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...RIF-Technology
 
Testing and Building Android
Testing and Building AndroidTesting and Building Android
Testing and Building AndroidDroidcon Berlin
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018Wim Selles
 
An introduction to Machine Learning
An introduction to Machine LearningAn introduction to Machine Learning
An introduction to Machine LearningValéry BERNARD
 
MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system Tarin Gamberini
 
Automation testing IBM RFT - Rational Functional Tester
Automation testing IBM RFT - Rational Functional TesterAutomation testing IBM RFT - Rational Functional Tester
Automation testing IBM RFT - Rational Functional TesterVijayChowthri Nagaprakasham
 
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...Finding the important bugs- A talk by John Scarborough, Director of Testing, ...
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...HARMAN Services
 
Introduction Machine Learning by MyLittleAdventure
Introduction Machine Learning by MyLittleAdventureIntroduction Machine Learning by MyLittleAdventure
Introduction Machine Learning by MyLittleAdventuremylittleadventure
 
Joomla! Testing - J!DD Germany 2016
Joomla! Testing - J!DD Germany 2016Joomla! Testing - J!DD Germany 2016
Joomla! Testing - J!DD Germany 2016Yves Hoppe
 
Write once, ship multiple times
Write once, ship multiple timesWrite once, ship multiple times
Write once, ship multiple timesŽeljko Plesac
 
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptx
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptxOS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptx
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptxShivareddyGangam
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 
Tech Days 2015: Model Based Development with QGen
Tech Days 2015: Model Based Development with QGenTech Days 2015: Model Based Development with QGen
Tech Days 2015: Model Based Development with QGenAdaCore
 
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 Pipelines
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 PipelinesNIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 Pipelines
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 PipelinesChing-Hwa Yu
 

Similar to How to Start Test Automation (20)

What is the best approach to tdd
What is the best approach to tddWhat is the best approach to tdd
What is the best approach to tdd
 
BDD from QA side
BDD from QA sideBDD from QA side
BDD from QA side
 
Susan windsor soft test 16th november 2005
Susan windsor soft test   16th november 2005Susan windsor soft test   16th november 2005
Susan windsor soft test 16th november 2005
 
How to kill test flake in appium
How to kill test flake in appiumHow to kill test flake in appium
How to kill test flake in appium
 
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...
Антон Семенченко | (EPAM Systems, DPI.Solutions )Сравнительный анализ инстру...
 
Testing and Building Android
Testing and Building AndroidTesting and Building Android
Testing and Building Android
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
 
An introduction to Machine Learning
An introduction to Machine LearningAn introduction to Machine Learning
An introduction to Machine Learning
 
MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system
 
Automation testing IBM RFT - Rational Functional Tester
Automation testing IBM RFT - Rational Functional TesterAutomation testing IBM RFT - Rational Functional Tester
Automation testing IBM RFT - Rational Functional Tester
 
Automation testing
Automation testingAutomation testing
Automation testing
 
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...Finding the important bugs- A talk by John Scarborough, Director of Testing, ...
Finding the important bugs- A talk by John Scarborough, Director of Testing, ...
 
Introduction Machine Learning by MyLittleAdventure
Introduction Machine Learning by MyLittleAdventureIntroduction Machine Learning by MyLittleAdventure
Introduction Machine Learning by MyLittleAdventure
 
Joomla! Testing - J!DD Germany 2016
Joomla! Testing - J!DD Germany 2016Joomla! Testing - J!DD Germany 2016
Joomla! Testing - J!DD Germany 2016
 
Test
TestTest
Test
 
Write once, ship multiple times
Write once, ship multiple timesWrite once, ship multiple times
Write once, ship multiple times
 
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptx
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptxOS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptx
OS-Final-Transform-Manual-Testing-Processes-to-incorporate-Automatio....pptx
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Tech Days 2015: Model Based Development with QGen
Tech Days 2015: Model Based Development with QGenTech Days 2015: Model Based Development with QGen
Tech Days 2015: Model Based Development with QGen
 
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 Pipelines
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 PipelinesNIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 Pipelines
NIWeek 2017 - Automated Test of LabVIEW FPGA Code: CI and Jenkins 2 Pipelines
 

Recently uploaded

CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...
CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...
CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...henrik385807
 
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesVVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesPooja Nehwal
 
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort ServiceDelhi Call girls
 
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxNikitaBankoti2
 
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Hasting Chen
 
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdf
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdfCTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdf
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdfhenrik385807
 
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024eCommerce Institute
 
Mathematics of Finance Presentation.pptx
Mathematics of Finance Presentation.pptxMathematics of Finance Presentation.pptx
Mathematics of Finance Presentation.pptxMoumonDas2
 
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxMohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxmohammadalnahdi22
 
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Kayode Fayemi
 
Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Chameera Dedduwage
 
Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Vipesco
 
Microsoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AIMicrosoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AITatiana Gurgel
 
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...Pooja Nehwal
 
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Delhi Call girls
 
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, YardstickSaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, Yardsticksaastr
 
Presentation on Engagement in Book Clubs
Presentation on Engagement in Book ClubsPresentation on Engagement in Book Clubs
Presentation on Engagement in Book Clubssamaasim06
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaKayode Fayemi
 
George Lever - eCommerce Day Chile 2024
George Lever -  eCommerce Day Chile 2024George Lever -  eCommerce Day Chile 2024
George Lever - eCommerce Day Chile 2024eCommerce Institute
 
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )Pooja Nehwal
 

Recently uploaded (20)

CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...
CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...
CTAC 2024 Valencia - Sven Zoelle - Most Crucial Invest to Digitalisation_slid...
 
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara ServicesVVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
VVIP Call Girls Nalasopara : 9892124323, Call Girls in Nalasopara Services
 
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 93 Noida Escorts >༒8448380779 Escort Service
 
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docxANCHORING SCRIPT FOR A CULTURAL EVENT.docx
ANCHORING SCRIPT FOR A CULTURAL EVENT.docx
 
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
Re-membering the Bard: Revisiting The Compleat Wrks of Wllm Shkspr (Abridged)...
 
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdf
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdfCTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdf
CTAC 2024 Valencia - Henrik Hanke - Reduce to the max - slideshare.pdf
 
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
Andrés Ramírez Gossler, Facundo Schinnea - eCommerce Day Chile 2024
 
Mathematics of Finance Presentation.pptx
Mathematics of Finance Presentation.pptxMathematics of Finance Presentation.pptx
Mathematics of Finance Presentation.pptx
 
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptxMohammad_Alnahdi_Oral_Presentation_Assignment.pptx
Mohammad_Alnahdi_Oral_Presentation_Assignment.pptx
 
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
Governance and Nation-Building in Nigeria: Some Reflections on Options for Po...
 
Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)Introduction to Prompt Engineering (Focusing on ChatGPT)
Introduction to Prompt Engineering (Focusing on ChatGPT)
 
Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510Thirunelveli call girls Tamil escorts 7877702510
Thirunelveli call girls Tamil escorts 7877702510
 
Microsoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AIMicrosoft Copilot AI for Everyone - created by AI
Microsoft Copilot AI for Everyone - created by AI
 
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...
Navi Mumbai Call Girls Service Pooja 9892124323 Real Russian Girls Looking Mo...
 
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
Night 7k Call Girls Noida Sector 128 Call Me: 8448380779
 
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, YardstickSaaStr Workshop Wednesday w/ Lucas Price, Yardstick
SaaStr Workshop Wednesday w/ Lucas Price, Yardstick
 
Presentation on Engagement in Book Clubs
Presentation on Engagement in Book ClubsPresentation on Engagement in Book Clubs
Presentation on Engagement in Book Clubs
 
If this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New NigeriaIf this Giant Must Walk: A Manifesto for a New Nigeria
If this Giant Must Walk: A Manifesto for a New Nigeria
 
George Lever - eCommerce Day Chile 2024
George Lever -  eCommerce Day Chile 2024George Lever -  eCommerce Day Chile 2024
George Lever - eCommerce Day Chile 2024
 
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )
WhatsApp 📞 9892124323 ✅Call Girls In Juhu ( Mumbai )
 

How to Start Test Automation

  • 1. HOW TO START TEST AUTOMATION KANSTANTSIN HARBACHOU JUNE 20, 2019
  • 2. 2 AGENDA START TEST AUTOMATION 1. Critical aspects 2. Typical mistakes 3. Programming approaches 4. Review of existing tools 5. Q&A
  • 4. 4 HOW TO CHOOSE TOOLS? START TEST AUTOMATION
  • 5. 5 WHICH PROGRAMMING LANGUAGE TO CHOOSE START TEST AUTOMATION Project Experience Functionality System under test …
  • 6. 6 HOW TO RUN TESTS? START TEST AUTOMATION
  • 7. 7 WHERE WILL WE RUN? START TEST AUTOMATION
  • 11. 11 DON’T UPSET UNCLE BOB START TEST AUTOMATION
  • 12. 12 TYPICAL MISTAKES START TEST AUTOMATION Overengineering Difficult maintenance All at once Hipster’s approach
  • 20. 20 SINGLETON START TEST AUTOMATION using System; namespace Singleton { class Singleton { private Singleton() { } private static Singleton _instance; public static Singleton GetInstance() { if (_instance == null) { _instance = new Singleton(); } return _instance; } public static void SomeBusinessLogic() { // ... } } class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("Singleton works, both variables contain the same instance."); } else { Console.WriteLine("Singleton failed, variables contain different instances."); } } } }
  • 22. 22 BUILDER START TEST AUTOMATION public interface IBuilder { void BuildPartA(); void BuildPartB(); void BuildPartC(); } public class ConcreteBuilder : IBuilder { private Product _product = new Product(); public ConcreteBuilder() { this.Reset(); } public void Reset() { this._product = new Product(); } public void BuildPartA() { this._product.Add("PartA1"); } public void BuildPartB() { this._product.Add("PartB1"); } public void BuildPartC() { this._product.Add("PartC1"); } public Product GetProduct() { Product result = this._product; this.Reset(); return result; } } public class Product { private List<object> _parts = new List<object>(); public void Add(string part) { this._parts.Add(part); } public string ListParts() { string str = string.Empty; for (int i = 0; i < this._parts.Count; i++) { str += this._parts[i] + ", "; } str = str.Remove(str.Length - 2); return "Product parts: " + str + "n"; } } public class Director { private IBuilder _builder; public IBuilder Builder { set { _builder = value; } } public void BuildMinimalViableProduct() { this._builder.BuildPartA(); } public void BuildFullFeaturedProduct() { this._builder.BuildPartA(); this._builder.BuildPartB(); this._builder.BuildPartC(); } } class Program { static void Main(string[] args) { var director = new Director(); var builder = new ConcreteBuilder(); director.Builder = builder; Console.WriteLine("Standard basic product:"); director.BuildMinimalViableProduct(); Console.WriteLine(builder.GetProduct().ListParts()); Console.WriteLine("Standard full featured product:"); director.BuildFullFeaturedProduct(); Console.WriteLine(builder.GetProduct().ListParts()); Console.WriteLine("Custom product:"); builder.BuildPartA(); builder.BuildPartC(); Console.Write(builder.GetProduct().ListParts()); } } Standard basic product: Product parts: PartA1 Standard full featured product: Product parts: PartA1, PartB1, PartC1 Custom product: Product parts: PartA1, PartC1
  • 24. 24 FABRIC START TEST AUTOMATION public static class WebDriverFactory { public static IWebDriver CreateWebDriver(WebBrowser name) { switch (name) { case WebBrowser.Firefox: return new FirefoxDriver(); case WebBrowser.IE: case WebBrowser.InternetExplorer: InternetExplorerOptions ieOption = new InternetExplorerOptions(); ieOption.IntroduceInstabilityByIgnoringProtectedModeSettings = true; ieOption.EnsureCleanSession = true; ieOption.RequireWindowFocus = true; return new InternetExplorerDriver(@"./", ieOption); case "safari": return new RemoteWebDriver(new Uri("http://mac-ip-address:the-opened-port"), DesiredCapabilities.Safari()); case WebBrowser.Chrome: default: ChromeOptions chromeOption = new ChromeOptions(); string location = @"./"; chromeOption.AddArguments("--disable-extensions"); return new ChromeDriver(location, chromeOption); } } } public enum WebBrowser { IE, InternetExplorer, Firefox, Chrome } var driver = WebDriverFactory.CreateWebDriver(WebBrowser.Chrome);
  • 26. 26 DECORATOR START TEST AUTOMATION public abstract class Component { public abstract string Operation(); } class ConcreteComponent : Component { public override string Operation() { return "ConcreteComponent"; } } abstract class Decorator : Component { protected Component _component; public Decorator(Component component) { this._component = component; } public void SetComponent(Component component) { this._component = component; } public override string Operation() { if (this._component != null) { return this._component.Operation(); } else { return string.Empty; } } } class ConcreteDecoratorA : Decorator { public ConcreteDecoratorA(Component comp) : base(comp) { } public override string Operation() { return $"ConcreteDecoratorA({base.Operation()})"; } } class ConcreteDecoratorB : Decorator { public ConcreteDecoratorB(Component comp) : base(comp) { } public override string Operation() { return $"ConcreteDecoratorB({base.Operation()})"; } } public class Client { public void ClientCode(Component component) { Console.WriteLine("RESULT: " + component.Operation()); } } class Program { static void Main(string[] args) { Client client = new Client(); var simple = new ConcreteComponent(); Console.WriteLine("Client: I get a simple component:"); client.ClientCode(simple); Console.WriteLine(); ConcreteDecoratorA decorator1 = new ConcreteDecoratorA(simple); ConcreteDecoratorB decorator2 = new ConcreteDecoratorB(decorator1); Console.WriteLine("Client: Now I've got a decorated component:"); client.ClientCode(decorator2); } } Client: I get a simple component: RESULT: ConcreteComponent Client: Now I've got a decorated component: RESULT: ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
  • 30. Q & A

Editor's Notes

  1. Всем привет! Меня зовут Горбачёв Константин. Я работаю в компании iTechArt автоматизатором около года. Суммарный опыт в автоматизации более 3 лет. Этот доклад является своеобразным обзором наиболее частых ошибок при старте автоматизированного тестирования. Здесь собраны итоги как работы на проекте, так и при проведении тренингов.
  2. Данный доклад будет разбит на 4 смысловых секции, а по его завершению будет секция вопросов и ответов. За лучший вопрос у нас приготовлен подарок от компании. Первая секция делает упор на наиболее критичные аспекты при выборе того или иного инструмента или языка программирования. Во второй секции я расскажу про наиболее распространённые ошибки при написании тестового фреймворка. Третья секция содержит минимальный набор паттернов и подходов к программированию, соблюдение которых если и не позволит предотвратить массовое переписывание и рефакторинг фреймворка, то как минимум сделает его менее болезненным. И в четвёртой секции я расскажу про существующие врапперы над Selenium, к которым можно присмотреться.
  3. И так, начнём. Сейчас мы поговорим про инфраструктуру и языки.
  4. Этот мемас говорит сам за себя. Хотя он больше для фана, однако актуальность свою не теряет. Ничего плохого про людей с различных комьюнити сказать не хочу, но не забывайте, что каждый решает свои проблемы и они могут с вашими пересекаться лишь частично.
  5. Начнём с самого важного: на чём мы будем писать код и наши тесты. Некоторые пункты могут пересекаться между собой. Исторически сложилось так, что автотесты пишутся на том же языке, что и приложение. В пользу этого подхода приводят единую экосистему, возможность поддерживания автотестов разработчиками и, как вариант, помощь разработчиков, если у автоматизатора не совсем хватает скиллов в программировании. Как вариант, который я даже лично видел, это выбор автоматизатором ЯП, в котором он имеет больший опыт. Один из случаев – это когда проект имеет узкую задачу, сдаётся и живёт своей жизнью, в течении которой правки либо минимальны либо их вообще нет. Так же важную роль играет и функциональность, которую необходимо проверить. Не на всех языках есть нужные для этого библиотеки, например для селениума того же, тогда зоопарк из языков неизбежен. Не стоит забывать, что из себя представляет тестируемая система, где она хостится. Как пример – десктопное приложение под одну конкретную ось. Следующий пункт это инфраструктура, и она заслуживает большего, чем быть просто одним из вариантов.
  6. Здесь представлено лишь малое количество тестраннеров с различных языков программирования. Их выбор тоже зависит от инфарструктуры. Если кто знаком с платформой .net, то должен знать, что там есть Nunit, xunit и mstest. В своё время у нас был продукт и в качестве CI/CD платформы использовался TFS 2015 он как раз и сыграл роль на составление данного слайда. Как оказалось в то время TFS мог корректно распределять по тестагентам только тесты на MSTest, а т.к. мы этого не знали и настройка инфраструктуры заказчиком закончилась только через несколько спринтов, то мы начали писать тесты на Nunit. Как итог пришлось всё спешно рефакторить.
  7. Кроме написания автотестов нам их придётся где-то запускать. Для этого у нас есть куча возможностей. Бывает, что заказчик уже имеет проплаченный аккаунт в облачном сервисе вроде саус лаба или браузер стэка. Возможно вы захотите их напрямую запускать в докере на своих серверах, тогда не стоит забывать о виртуализации, и да, хоть на дворе и 2019 год, но её может не быть или она может быть отключена. Возможно вы захотите запускать по старинке через селениум грид, тоже ваше право. В особых случаях вам понадобится микс, часть тестов на своей инфраструктуре, а часть на облачной, когда подготовка своей требует много сил и времени. В последнее время всё больше компания в том числе и MS движутся в направлении кросс-платформенности, но всё равно пока что ОС играет свою роль. Ну и не стоит забывать о громадном количестве CI инструментов, как дженкинс, тфс, тимсити. Каждый из них обладает своими возможностями по интеграции с другим инструментарием, различными плагинами и возможностями.
  8. Кроме обычных технических проблем перед нами могут встать и проблемы на уровне приложения и заказчика.
  9. Рассказывали о случае, что доступ к приложению был только через ремоут десктоп, написание и дебаг автотестов был очень проблематичным, поэтому не оставалось ничего лучшего, как использовать Sikuli, инструмент для поиска нужных контроллов по графическому изображению. Т.е. людям приходилось делать скриншоты и использовать их для клика, печатания текста и т.д., что в свою очередь трудно назвать быстрым и надёжным способом автоматизации. Также возможен кейс, когда с нашим приложением мы можем делать, что угодно, но есть определённая его часть, которую мы никак не контролируем и которая тоже может оказывать своё влияние на системы и автотесты в частности. Актуально это, когда происходит интеграция с другой командой. Сложная логика приложения в основном оказывает влияние на построение тестового фреймворка. Здесь вопрос больше стоит в области подхода написания кода. Также в таких случаях стоит задуматься о том, как параллелить автотесты. Не всегда есть доступ и к хранилищу данных и бывает это по различным причинам. В таких случаях следует задуматься о каких-то предустановленных данных. На одном из проектов заказчик сам руками создавал нужные такие данные с определённым префиксом и по запросу откатывал базу в исходное состояние. Ну и остаются различные сторонние системы. В основном их тестированием никто не занимается, кроме самих разработчиков этих систем. Но они могут оказывать влияние изменяемыми данными. Как, например, было с одной платёжной скандинавской. Работу с ней приходилось протестировать, но в зависимости от страны, некоторые тарифы и меню изменялось.
  10. В этой секции поговорим о наиболее распространённых ошибках при построении тестового фреймворка.
  11. Дальше я частично вдохновлялся трудами Роберта Мартина, который говорил что “система в исходном состоянии практически до конца не доживает, она постепенно переписывается”
  12. И так на основе его книг и своего опыта я выделил основные пункты. Под оверинженирингом я подразумеваю паттерн ради паттерна и усложнение фреймворка на начальном этапе. Это в основном касается автоматизации на новом проекте. В таком случае в начале пути ещё не известна чёткая бизнес логика и структура. Будут ли у нас какие-нибудь сущности видоизменятся или нет. Под вопросом чёткое флоу по приложению, до конца не понятно каким финальным будет путь для получения того или иного результата. Начальная стадия – не самое лучшее время для приложения усилий на формировании каких-либо сервисов. Автотесты от приложения мало чем отличаются по своей сути и то и то имеет право на рефакторинг и видоизменение. Главное – найти золотую середину над качеством кода и его структурой и простотой, быстротой его написания. Трудность сопровождения касается как и написания тестов, так и их запуск локально и на CI системах. Если в последнем случае мы раз настроили и забыли, то с локальным запуском не всё так просто. На моей практике были случаи, когда разработчики меняли UI координально и хотели запускать автотесты локально. Как известно, времени у них сильно много и бэклог имеет свойство забиваться тикетами. Им требовалось чёткое понимание как поменять локаторы и как всё быстро собрать и запустить у себя на машине. Также к написанию тестов могут привлекаться люди мало знакомые с автоматизацией. Например мануальные тестировщики или разработчики. И им тоже есть, чем забить голову по проекту. Поэтому в идеале для них всё должно быть структурировано и понятно. Не стоит также делать всё и сразу прямо сейчас. Если касаться юая, то сейчас реалии таковы, что на рынке представлено большое разнообразие различных фреймворков, cms систем и библиотек для него. Поэтому для начала стоит уделить внимание тестовому покрытию и стабильности тестов. На длительный прогон при наличии правдивой информации о качестве приложения глаза закроют. Но если у вас тесты будут бегать в параллель за 10 минут и покрыты будут сложные кейсы, но при этом будет много флаки тестов, то тут вопросы возникнут. Не следует и прибегать ко всему модному и современному. Здесь я не призываю к ретроградству, а хочу лишь подчеркнуть, что каждое решение должно быть взвешанно. Это больше касается мира JS. С одной стороны наличие такого количества инструментов это хорошо, с другой – надо отслеживать заведомо рискованные.
  13. В этой секции поговорим непосредственно о коде.
  14. Как я и говорил всё хорошо в меру. Тот же Page object не панацея от всех бед. Был случай когда мы даже и не использовали данные подход, а дёргали напрямую обёртки над элементами. Такой подход оказался проще и удобнее. Т.к. приложение по сути состояло из одних смарт-элементом и было Single Page Application.
  15. Всё, что будет рассказано на ближайших двух слайдах не призыв к действию и использованию, а лишь минимальный и часто используемый материал, необходимый тем, кто пишет код. За кулисами остаётся гораздо больше. KISS – keep it simple, stupid. Суть этого принципа состоит в том, что простая система стабильнее усложнённой. Вкратце это значит, что всё должно дробиться на мелкие куски для дальнейшего переиспользования или замены, если в будущем всплывут какие-либо технические подробности, которые на момент написания кода неизвестны. YAGNI – you aren’t gonna need it. Основная идея – реализовывать только то, что надо здесь и сейчас без задела на будущее. Если какой-то функционал может быть добавлен, но это на уровне слухов, то не следует сейчас об этом задумываться, всё может поменяться. SOLID - Принцип единственной ответственности (The Single Responsibility Principle)Каждый класс выполняет лишь одну задачу.OOCP[6]Принцип открытости/закрытости (The Open Closed Principle)«программные сущности … должны быть открыты для расширения, но закрыты для модификации.»LLSP[7]Принцип подстановки Барбары Лисков (The Liskov Substitution Principle)«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.»Наследующий класс должен дополнять, а не изменять базовый. IISP[8]Принцип разделения интерфейса (The Interface Segregation Principle)«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»[9]DDIP[10]Принцип инверсии зависимостей (The Dependency Inversion Principle)«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»[9] Все эти принципы формируют культуру написания кода и построения архитектуры приложения. Знание и следование им позволит сократить время на согласование различных нюансов по структуре кода. Как итог – снизится порог вхождения в тестовый фреймворк.
  16. KISS – keep it simple, stupid. Суть этого принципа состоит в том, что простая система стабильнее усложнённой. Вкратце это значит, что всё должно дробиться на мелкие куски для дальнейшего переиспользования или замены, если в будущем всплывут какие-либо технические подробности, которые на момент написания кода неизвестны.
  17. YAGNI – you aren’t gonna need it. Основная идея – реализовывать только то, что надо здесь и сейчас без задела на будущее. Если какой-то функционал может быть добавлен, но это на уровне слухов, то не следует сейчас об этом задумываться, всё может поменяться.
  18. SOLID - Принцип единственной ответственности (The Single Responsibility Principle)Каждый класс выполняет лишь одну задачу.OOCP[6]Принцип открытости/закрытости (The Open Closed Principle)«программные сущности … должны быть открыты для расширения, но закрыты для модификации.»LLSP[7]Принцип подстановки Барбары Лисков (The Liskov Substitution Principle)«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.»Наследующий класс должен дополнять, а не изменять базовый. IISP[8]Принцип разделения интерфейса (The Interface Segregation Principle)«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»[9]DDIP[10]Принцип инверсии зависимостей (The Dependency Inversion Principle)«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»[9] Все эти принципы формируют культуру написания кода и построения архитектуры приложения. Знание и следование им позволит сократить время на согласование различных нюансов по структуре кода. Как итог – снизится порог вхождения в тестовый фреймворк.
  19. Паттерн – это образец решения некой часто встречаемой задачи. На самом деле их в разы больше, но приведенных за глаза хватит в большинстве тестовых фреймворков.
  20. Singleton гарантирует наличие лишь одного экземпляра класса в данный момент времени. Может использоваться для ресурсоёмких объектов, например, для создания экземпляра вебдрайвера или подключение к базе данных.
  21. Singleton гарантирует наличие лишь одного экземпляра класса в данный момент времени. Может использоваться для ресурсоёмких объектов, например, для создания экземпляра вебдрайвера или подключение к базе данных.
  22. Builder используется для построения больших объектов. Основная его задача – сократить количество конструкторов класса, когда существует большая вариация возможно объектов. В качестве примера можно привести смарт таблицы. Там могут быть запиненные колонки, различные экшен меню, в колонках вместо текста может быть другой элемент и т.д.
  23. Builder используется для построения больших объектов. Основная его задача – сократить количество конструкторов класса, когда существует большая вариация возможно объектов. В качестве примера можно привести смарт таблицы. Там могут быть запиненные колонки, различные экшен меню, в колонках вместо текста может быть другой элемент и т.д.
  24. Фабрики чаще используются для создания экземпляра вебдрайвера с нужной конфигурацией и параметрами.
  25. Фабрики чаще используются для создания экземпляра вебдрайвера с нужной конфигурацией и параметрами.
  26. Decorator позволяет обернуть объект дополнительным функционалом без изменения самого объекта. Один из основных вариантов применения – добавление логирования и подсветку элементов.
  27. Decorator позволяет обернуть объект дополнительным функционалом без изменения самого объекта. Один из основных вариантов применения – добавление логирования и подсветку элементов.
  28. В заключительной части мы поговорим про существующие врапперы над селениумом.
  29. Врапперы это достаточно холиварная тема. Одни их хаят за отсутствие контроля, а вторые боготоврят за решение определённых проблем. Здесь представлены наиболее популярные врапперы и готовые фреймворки. Самые топовые из них это codeceptjs и selenide. Вокруг них построены хорошие комьюнити, довольно активно развиваются. JDI поддерживает джаву и сишарп, как и атата это уже полноценные фреймворки со своими абстракциями над пейджами. Ну и канопи только недавно начал активно развиваться и популяризироваться. Он поддерживает f# и функциональный принцип программирования. Есть также нселен под сишарп и селен под пайтон. Они работают до сих пор, хотя уже давно и не развиваются. Ну и при выборе того или иного инструмента не забывайте, что впервую очередь он решает проблемы его создателя. Хотя многие из них стараются быть универсальным, но пока они находятся в опен-сорсе никто не гарантирует, что недостающий вам функционал будет реализован по первому запросу.
  30. На этом у меня всё. Готов ответить на ваши вопросы.