SlideShare a Scribd company logo
@Ben_Hall
Ben@BenHall.me.uk
 Blog.BenHall.me.uk
Me?
Aim to this talk
• Allow you to make an informed, educated
  decision for your project.
• Know how to quickly get started if you want to
• Know alternative approaches if you don’t
Agenda
•   UI Browser Automation
•   Databases and Data Creation
•   Below the UI Testing
•   Group therapy

• Pain points, problems, concerns
• Best approaches to deal with these
What do I mean by
ASP.NET automated
acceptance testing?
Google Search

DEMO OF AUTOMATED TESTING
var driver = new FirefoxDriver(new FirefoxProfile());
driver.Navigate().GoToUrl("http://www.google.co.uk");
IWebElement searchbox = driver.FindElement(By.Name("q"));

searchbox.SendKeys("ASP.net");
searchbox.SendKeys(Keys.Enter);

var results = driver.FindElement(By.LinkText("Get Started with
   ASP.NET & ASP.NET MVC : Official Microsoft Site"))
Assert.IsNotNull(results);
Testing pipeline
• Outside in, driven from requirements
• TDD to drive inside aspects once UI
  automated

• Idealistic.. Doesn’t work. Expensive! (Will
  define this later)
Real World...
     •   Bring flexible to change
     •   Regression testing
     •   Pushing forward, rapidly.
     •   Protecting your own arse




http://4.bp.blogspot.com/-v6mzllgkJlM/Tm-yiM4fPEI/AAAAAAAAE34/7-BEetlvyHo/s1600/matrix1.jpg
Testing ASP.NET - Progressive.NET
• Focus on solving a pain you have.
• Automated UI Testing is one way, which
  works, but it’s not the only way.
• Hire a manual tester? Short-term gain, long
  term pain.
Pain you may have in the future

   Depends on the system / scenario.
   UI Tests may not be the best way
Spike and Stabilise

Get something out, get feedback,
         make it right.
It’s not all about code quality!

   Should not be the driving force
• Driving quality of your code via UI tests will kill
  your motivation for the entire project.
• IT HURTS! Been there, done that!
• Focus on what will help you deliver value
• Automated tests are expensive.

• How do you define value?
• Justify cost by delivering faster? Less bugs?
  Company loses less money?
Are “bugs” really bugs if they don’t
cost the company money nor annoy
              users?
Developers love making things complex




http://xkcd.com/974/
WHAT SHOULD YOU TEST?
Scenarios
• UI test should focus on scenarios
  – Behaviour.
  – Not actions.
A single test can save your career
Example of a 7digital career saver test
• 1) Can registered users add to basket and
  checkout?
• 2) Can people register

• Everything else is null and void if those don’t
  work
80/20 Rule

80% of the value comes from
        20% of tests
Design UI for testability
• Good CSS
• Good UX
• A bad UX will be extremely difficult to test
  – Code/Test smell!
<div>
 <div>
  <p>Some random text</p>
  <div>
       <p>Error Message</p>
  </div>
 </div>
</div>
                                            Much easier to test!
<div>
 <div>
  <p>Some random text</p>
  <div>
       <p class=“error”>Error Message</p>
  </div>
 </div>
</div>
Safety net when refactoring
        legacy code
• TDD Rules do apply – naming
• TDD doesn’t – single assertion
Automated tests against production
• Everything before (TDD, Staging etc) is just a
  precaution
• If it goes live and it’s dead – it’s pointless.
• Focused smoke tests
CODE & TOOLS
Selenium WebDriver
WebDriver is AMAZING!!!

  Google, Mozilla, Community
Creating a browser instance
new FirefoxDriver(new FirefoxProfile());

new InternetExplorerDriver();

new ChromeDriver(@".")

                                chromedriver.exe
Element Locator Strategies
Basically jQuery

driver.FindElement(By.Name("q"));
driver.FindElement(By.ClassName(“error-msg"))
driver.FindElement(By.Id("album-list"))
Page Interactions
Basically jQuery

.Text
.Click()
.Submit()
.SendKeys()  Used for inputing text
Executing JS
public static T ExecuteJS<T>(IWebDriver driver, string js) {
  IJavaScriptExecutor jsExecute = driver as IJavaScriptExecutor;
  return (T)jsExecute.ExecuteScript(js);
}



$(“.NewHeader.header .earn .dropdown-menu”).show();
Patiently Waiting
var time = new TimeSpan(0, 0, 30);
var timeouts = driver.Manage().Timeouts();
timeouts.ImplicitlyWait(time);
Patiently Waiting Longer
Use JS code / test hooks in application

window.SWAPP.isReady === true
[TestFixtureSetUp]
 public void CreateDriver() {
 _driver = new FirefoxDriver(new FirefoxProfile());
  _driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0,
   30));
}

 [SetUp]
 public void NavigateToWebpage() {
   _driver.Navigate().GoToUrl(WebApp.URL);
}

[TestFixtureTearDown]
public void FixtureTearDown() {
  if (_driver != null)
     _driver.Close();
}
But I told everyone to use Ruby
When tests fail have good
  debugging output
public static string TakeScreenshot(IWebDriver driver)
{
  string file = Path.GetTempFileName() + ".png";
  var s = ((ITakesScreenshot)driver);

    s.GetScreenshot().SaveAsFile(file, ImageFormat.Png);

    return file;
}
FUNDAMENTAL PROBLEM

      Websites change.
   Or at least they should.
public class ItemListing
{
    IWebDriver _driver;
    public ItemListing(IWebDriver driver) {
       _driver = driver;
    }

    public void AddToCart()
    {
      _driver.FindElement(By.Id("addToCart")).Click();
    }
}
TEA PLEASE
• MVC Music Store
• http://www.github.com
• /BenHall/ProgNet2012

• HelloWorldExamples/
• Installers/
• MVCMusicStore/
1. Test that item appears on the homepage
2. Automate adding an item to the basket



• Pair – Great opportunity.
YOUR TURN
http://www.github.com
/BenHall/ProgNet2012
public int HeaderCount(string cartCount) {
   var regex = new Regex(@"^Cart ((d+))$");
   var match = regex.Match(cartCount);
   var i = match.Groups[1].Captures[0].Value;
   return Convert.ToInt32(i);
 }
Thanks
So what did I do?
Testing ASP.NET - Progressive.NET
SLOW!!




http://www.flickr.com/photos/57734740@N00/184375292/
Internet Explorer
SetUp : System.InvalidOperationException :
  Unexpected error launching Internet Explorer.
  Protected Mode must be set to the same
  value (enabled or disabled) for all zones.
  (NoSuchDriver)
Complex Xpath / CSS Selectors

table[@id='foo2']/tbody/tr/td/a[contains(text(),'whatever')]
Don’t care about the minor details
• CSS downloading correctly...
• Other ways to solve that problem without UI
  testing
Form validation
• Could it be a unit test?
• Do you need to run it every time if it hasn’t
  changed?
• It’s a risk – how calculated is it?
DATABASES
CACHING

http://www.flickr.com/photos/gagilas/2659695352/
LEGACY DATABASE SCHEMA

http://www.flickr.com/photos/gagilas/2659695352/
Highly Coupled workflow
• UI Tests become highly coupled to the UI and
  existing workflow

• UI changes – or at least should. Tests will
  break, need maintenance etc - BAD
Data Builders
• Be able to test website against a clean empty
  database
• Build only the data your tests need
• REALLY hard with a legacy system
  – Focus on long term and take small steps to get
    there
Example
var u =new UserCreator(“Name”, 13)
       .WithOptionalValue(“Of Something”)
       .WithCart(p1, p2, p3)
       .Build();



UserDeleter.Delete(u)
Simple.Data / Lightweight ORM
db.Users.Insert(Name: "steve", Age: 50)




https://github.com/markrendle/Simple.Data/wiki/Inserting-and-updating-
   data
Shared database
•   Be careful
•   Tests clash
•   Use random keys when inserting (not 1-10)
•   Delete only the data you insert
TEA PLEASE
WHY USE A BROWSER?
MVC Test Automation
       Framework
Hosts ASP.NET in it’s own AppDomain
        Didn’t work for me.
CassiniDev
CassiniDevServer server = new CassiniDevServer();
server.StartServer(Path.Combine(Environment.Curre
  ntDirectory,
  @"......CassiniDevHostingExample"));
string url = server.NormalizeUrl("/");
EasyHTTP and CSQuery
EasyHTTP – Get / Dynamic
var http = new HttpClient();
http.Request.Accept =
  HttpContentTypes.ApplicationJson;
var response = http.Get("url");
var customer = response.DynamicBody;
Console.WriteLine("Name {0}", customer.Name);
EasyHTTP - Post
var customer = new Customer();
customer.Name = "Joe";
customer.Email = "joe@smith.com";
var http = new HttpClient();
http.Post("url", customer,
  HttpContentTypes.ApplicationJson);
CSQuery
var sel = dom.Select("a");

var id = dom[0].id;
var href = dom[0]["href"];

dom.Each((i,e) => {
    if (e.id == "remove-this-id") {
         e.Parent().RemoveChild(e);
    }
});
var url = "http://www.amazon.co.uk/s/ref=nb_sb_noss_2?url=search-
   alias%3Daps&field-keywords=Testing+ASP.net&x=0&y=0"

var httpClient = new HttpClient();
var response = httpClient.Get(url);
var dom = CsQuery.CQ.Create(response.RawText);
StringAssert.Contains("Ben Hall", dom.Find(".ptBrand").Text());
var url = "
   http://search.twitter.com/search.json?q=prognet&&rpp=5&includ
   e_entities=true&result_type=mixed "

var httpClient = new HttpClient();
 var response = httpClient.Get(url);
 Assert.That(response.DynamicBody.results.Length > 0);
1. Host MVCMusicStore using CassiniDev
2. Test that item appears on the homepage

• Feel free to download completed solution
YOUR TURN
http://www.flickr.com/photos/buro9/298994863/




 VSTest & Record / Playback
    • Record / Playback
    • VSTest



    • Not every tool helps!
• Chrome Dev Tool + Console - AMAZING
http://www.flickr.com/photos/leon_homan/2856628778/
Before you write a test think

what would happen if this failed in production
      for 30 minutes? 4 hours? 3 days?
           Would anyone care?
      Would something else catch it?
Focus on true value
• Mix different approaches – Hezies 57




http://www.gourmetsteaks.com/wp-content/uploads/steak-sauce-heinz-57.jpg
Testing ASP.NET - Progressive.NET
“Running UI Tests”
http://www.flickr.com/photos/philliecasablanca/245684098
6/




                                                                    @Ben_Hall
                                                           Ben@BenHall.me.uk
                                                            Blog.BenHall.me.uk

More Related Content

PDF
Unit and functional testing with Siesta
PPTX
Java script unit testing
PDF
Functional Testing for React Native Apps
PDF
jQuery Proven Performance Tips & Tricks
PPTX
Testing Ext JS and Sencha Touch
PDF
Easy tests with Selenide and Easyb
PDF
Kiss PageObjects [01-2017]
PDF
Сергей Больщиков "Protractor Tips & Tricks"
Unit and functional testing with Siesta
Java script unit testing
Functional Testing for React Native Apps
jQuery Proven Performance Tips & Tricks
Testing Ext JS and Sencha Touch
Easy tests with Selenide and Easyb
Kiss PageObjects [01-2017]
Сергей Больщиков "Protractor Tips & Tricks"

What's hot (20)

PPT
Building Quality with Foundations of Mud
PDF
KISS Automation.py
PDF
Page Objects Done Right - selenium conference 2014
PDF
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
PPTX
Out of box page object design pattern, java
PDF
Token Testing Slides
PDF
Django Testing
PPT
A journey beyond the page object pattern
PDF
How to make Ajax work for you
KEY
Javascript unit testing, yes we can e big
PDF
Unit Testing JavaScript Applications
PDF
Introduction to Protractor
PDF
Intro To JavaScript Unit Testing - Ran Mizrahi
PDF
CBDW2014 - MockBox, get ready to mock your socks off!
PDF
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]
PDF
Building a JavaScript Library
PDF
Developer Tests - Things to Know
PDF
Top100summit 谷歌-scott-improve your automated web application testing
PPT
Internet Explorer 8 for Developers by Christian Thilmany
PDF
Painless JavaScript Testing with Jest
Building Quality with Foundations of Mud
KISS Automation.py
Page Objects Done Right - selenium conference 2014
Efficient Rails Test Driven Development (class 4) by Wolfram Arnold
Out of box page object design pattern, java
Token Testing Slides
Django Testing
A journey beyond the page object pattern
How to make Ajax work for you
Javascript unit testing, yes we can e big
Unit Testing JavaScript Applications
Introduction to Protractor
Intro To JavaScript Unit Testing - Ran Mizrahi
CBDW2014 - MockBox, get ready to mock your socks off!
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]
Building a JavaScript Library
Developer Tests - Things to Know
Top100summit 谷歌-scott-improve your automated web application testing
Internet Explorer 8 for Developers by Christian Thilmany
Painless JavaScript Testing with Jest
Ad

Viewers also liked (20)

PPTX
Node.js Anti Patterns
PPTX
What Designs Need To Know About Visual Design
PPTX
Taking advantage of the Amazon Web Services (AWS) Family
PPTX
Lessons from running potentially malicious code inside Docker containers
PPTX
Continuous deployment
PPTX
The Art Of Building Prototypes and MVPs
PPTX
Real World Lessons on the Pain Points of Node.js Applications
PPTX
Running Docker in Development & Production (DevSum 2015)
PDF
Kata - Devops CDSummit LA 2015
PPTX
Learning Patterns for the Overworked Developer
PDF
Alibaba Cloud Conference 2016 - Docker Open Source
PPTX
Running Docker in Development & Production (#ndcoslo 2015)
PPTX
Implementing Google's Material Design Guidelines
PPTX
Architecting .NET Applications for Docker and Container Based Deployments
PPTX
Deploying Windows Containers on Windows Server 2016
PPTX
Lessons from running potentially malicious code inside containers
PPTX
The How and Why of Windows containers
PPTX
Real World Experience of Running Docker in Development and Production
PPTX
How I learned to stop worrying and love the cloud
PPTX
Deploying applications to Windows Server 2016 and Windows Containers
Node.js Anti Patterns
What Designs Need To Know About Visual Design
Taking advantage of the Amazon Web Services (AWS) Family
Lessons from running potentially malicious code inside Docker containers
Continuous deployment
The Art Of Building Prototypes and MVPs
Real World Lessons on the Pain Points of Node.js Applications
Running Docker in Development & Production (DevSum 2015)
Kata - Devops CDSummit LA 2015
Learning Patterns for the Overworked Developer
Alibaba Cloud Conference 2016 - Docker Open Source
Running Docker in Development & Production (#ndcoslo 2015)
Implementing Google's Material Design Guidelines
Architecting .NET Applications for Docker and Container Based Deployments
Deploying Windows Containers on Windows Server 2016
Lessons from running potentially malicious code inside containers
The How and Why of Windows containers
Real World Experience of Running Docker in Development and Production
How I learned to stop worrying and love the cloud
Deploying applications to Windows Server 2016 and Windows Containers
Ad

Similar to Testing ASP.NET - Progressive.NET (20)

PPTX
Selenium WebDriver - Test automation for web applications
PPT
Internal DSLs For Automated Functional Testing
PPTX
4&5.pptx SOFTWARE TESTING UNIT-4 AND UNIT-5
PPTX
Automated UI testing done right (DDDSydney)
PDF
Behavior Driven UI Automation (Agile Testing Days 2017, Potsdam)
PDF
Lessons Learned When Automating
PPTX
Deep Dive Modern Apps Lifecycle with Visual Studio 2012: How to create cross ...
PDF
Behavior Driven Web UI Automation with Selenium and Cucumber/SpecFlow (BDDx L...
PDF
Implementing Test Automation in Agile Projects
PPT
selenium.ppt
PPT
selenium.ppt
PPT
selenium.ppt
PPTX
Automated UI Testing Done Right (QMSDNUG)
PPT
WE-06-Testing.ppt
DOC
Web testing essentials
PPTX
Implementing Test Automation in Agile Projects
PPT
Selenium testing - Handle Elements in WebDriver
PPTX
Evolution of Software Testing - Chuan Chuan Law
PDF
Test Automation for Packaged Systems: Yes, You Can!
PPT
Beginners QA Testing
Selenium WebDriver - Test automation for web applications
Internal DSLs For Automated Functional Testing
4&5.pptx SOFTWARE TESTING UNIT-4 AND UNIT-5
Automated UI testing done right (DDDSydney)
Behavior Driven UI Automation (Agile Testing Days 2017, Potsdam)
Lessons Learned When Automating
Deep Dive Modern Apps Lifecycle with Visual Studio 2012: How to create cross ...
Behavior Driven Web UI Automation with Selenium and Cucumber/SpecFlow (BDDx L...
Implementing Test Automation in Agile Projects
selenium.ppt
selenium.ppt
selenium.ppt
Automated UI Testing Done Right (QMSDNUG)
WE-06-Testing.ppt
Web testing essentials
Implementing Test Automation in Agile Projects
Selenium testing - Handle Elements in WebDriver
Evolution of Software Testing - Chuan Chuan Law
Test Automation for Packaged Systems: Yes, You Can!
Beginners QA Testing

More from Ben Hall (15)

PPTX
The Art Of Documentation - NDC Porto 2022
PPTX
The Art Of Documentation for Open Source Projects
PPTX
Three Years of Lessons Running Potentially Malicious Code Inside Containers
PPTX
Containers without docker
PPTX
Deploying windows containers with kubernetes
PPTX
The Art of Documentation and Readme.md for Open Source Projects
PPTX
How Secure Are Docker Containers?
PPTX
The Challenges of Becoming Cloud Native
PPTX
Scaling Docker Containers using Kubernetes and Azure Container Service
PPTX
The art of documentation and readme.md
PPTX
Experimenting and Learning Kubernetes and Tensorflow
PPTX
Running .NET on Docker
PPTX
Real World Lessons on the Pain Points of Node.JS Application
PPTX
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
PPTX
Real World Lessons On The Anti-Patterns of Node.JS
The Art Of Documentation - NDC Porto 2022
The Art Of Documentation for Open Source Projects
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Containers without docker
Deploying windows containers with kubernetes
The Art of Documentation and Readme.md for Open Source Projects
How Secure Are Docker Containers?
The Challenges of Becoming Cloud Native
Scaling Docker Containers using Kubernetes and Azure Container Service
The art of documentation and readme.md
Experimenting and Learning Kubernetes and Tensorflow
Running .NET on Docker
Real World Lessons on the Pain Points of Node.JS Application
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Real World Lessons On The Anti-Patterns of Node.JS

Recently uploaded (20)

PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Big Data Technologies - Introduction.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Approach and Philosophy of On baking technology
PPTX
1. Introduction to Computer Programming.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Getting Started with Data Integration: FME Form 101
PPTX
A Presentation on Artificial Intelligence
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
Tartificialntelligence_presentation.pptx
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Spectroscopy.pptx food analysis technology
PPTX
MYSQL Presentation for SQL database connectivity
Advanced methodologies resolving dimensionality complications for autism neur...
Spectral efficient network and resource selection model in 5G networks
Machine learning based COVID-19 study performance prediction
Big Data Technologies - Introduction.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
Approach and Philosophy of On baking technology
1. Introduction to Computer Programming.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Unlocking AI with Model Context Protocol (MCP)
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Building Integrated photovoltaic BIPV_UPV.pdf
Getting Started with Data Integration: FME Form 101
A Presentation on Artificial Intelligence
MIND Revenue Release Quarter 2 2025 Press Release
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Tartificialntelligence_presentation.pptx
SOPHOS-XG Firewall Administrator PPT.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
Spectroscopy.pptx food analysis technology
MYSQL Presentation for SQL database connectivity

Testing ASP.NET - Progressive.NET

Editor's Notes

  • #6: Ability to have an automated way to ensure that your application works on an end-to-end basis and it’s safe to deploy. Potentially a massive pain Potentially a massive life saver It all depends on how you approach it, it’s about the decisions.
  • #11: - Know when to break the rules. He can, he has experience. - Personally, I prefer to focus on what works
  • #80: $(“.NewHeader.header .earn .dropdown-menu”).show();