This document discusses automated acceptance testing for ASP.NET applications. It begins with a demonstration of using Selenium WebDriver to automate a Google search. The document then covers topics like the testing pipeline, challenges with real-world testing, focusing tests on solving specific pain points, and designing UI for testability. It emphasizes that UI tests should validate scenarios rather than individual actions and should focus on the most critical tests. The document also discusses tools, techniques, and strategies for testing databases, legacy systems, and more.
3. 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
4. Agenda
• UI Browser Automation
• Databases and Data Creation
• Below the UI Testing
• Group therapy
• Pain points, problems, concerns
• Best approaches to deal with these
5. What do I mean by
ASP.NET automated
acceptance testing?
7. 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);
8. Testing pipeline
• Outside in, driven from requirements
• TDD to drive inside aspects once UI
automated
• Idealistic.. Doesn’t work. Expensive! (Will
define this later)
9. 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
10.
11. • 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.
12. Pain you may have in the future
Depends on the system / scenario.
UI Tests may not be the best way
14. It’s not all about code quality!
Should not be the driving force
15. • Driving quality of your code via UI tests will kill
your motivation for the entire project.
• IT HURTS! Been there, done that!
16. • 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?
17. Are “bugs” really bugs if they don’t
cost the company money nor annoy
users?
22. 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
27. • TDD Rules do apply – naming
• TDD doesn’t – single assertion
28. 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
49. 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);
}
53. 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)
60. 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
61. 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
62. Example
var u =new UserCreator(“Name”, 13)
.WithOptionalValue(“Of Something”)
.WithCart(p1, p2, p3)
.Build();
UserDeleter.Delete(u)
71. 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);
72. EasyHTTP - Post
var customer = new Customer();
customer.Name = "Joe";
customer.Email = "joe@smith.com";
var http = new HttpClient();
http.Post("url", customer,
HttpContentTypes.ApplicationJson);
73. 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);
}
});
74. 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());
75. 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);
76. 1. Host MVCMusicStore using CassiniDev
2. Test that item appears on the homepage
• Feel free to download completed solution
81. 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?
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.
- Know when to break the rules. He can, he has experience. - Personally, I prefer to focus on what works