Developer Tester Collaboration: The Practical Side

Fd80f9c58b06270d42356dd77a32defa?s=47 Jim Holmes
November 08, 2013

Developer Tester Collaboration: The Practical Side

Updated with new organization and a bit of new content from my talk at QA Or The Highway in Feb, 2015.

Yes, Developers and Testers should spend more time talking. Yes, each can learn from the other. Your projects will go much more smoothly, and you'll deliver better software to your customers.

This deck is from my talk at SQADays 14 in Lviv, Ukraine.

Fd80f9c58b06270d42356dd77a32defa?s=128

Jim Holmes

November 08, 2013
Tweet

Transcript

  1. Developer Tester Collaboration The Practical Side

  2. Jim Holmes @aJimHolmes Jim@GuidepostSystems.com FrazzledDad.com

  3. Why Collaborate?

  4. None
  5. None
  6. None
  7. Less Drama

  8. None
  9. None
  10. More Value

  11. Why do testers avoid automation?

  12. Better Technology

  13. Better Testing

  14. Better Value

  15. How Collaborate?

  16. None
  17. When Collaborate?

  18. None
  19. Better Technology

  20. Devs can help Testers

  21. Understand the Architecture

  22. None
  23. Better automation coverage

  24. Database Business Logic Services UI

  25. Unit Tests

  26. Database Business Logic Services UI

  27. None
  28. None
  29. None
  30. Integration Tests

  31. Database Business Logic Services UI

  32. None
  33. Functional (UI) Tests

  34. None
  35. Database Business Logic Services UI

  36. video

  37. Backing APIs

  38. None
  39. Configuration and Switching

  40. None
  41. None
  42. None
  43. None
  44. Code Smells

  45. [Test] public void one_method_to_rule_them_all() { var profile = new FirefoxProfile();

    var exe = new FirefoxBinary(@"D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); IWebDriver browser = new FirefoxDriver(exe, profile); WebDriverWait w = new WebDriverWait(browser,TimeSpan.FromSeconds(10)); browser.Navigate().GoToUrl("http://localhost/AJAXDemos/CascadingDropDown/CascadingDropDown.aspx"); //browser.Navigate().GoToUrl("http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList1')/option[text()='Acura']"))); var sl =browser.FindElement(By.Id("ctl00_SampleContent_DropDownList1")); var l = new SelectElement(sl); l.SelectByText("Acura"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList2')/option[text()='Integra']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList2")); l = new SelectElement(sl); l.SelectByText("Integra"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList3')/option[text()='Sea Green']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList3")); l = new SelectElement(sl); l.SelectByText("Sea Green"); w.Until(ExpectedConditions.ElementExists(By.XPath("//span[@id='ctl00_SampleContent_Label1' and text()='You have chosen a Sea Green Acura Integra. Nice car!']"))); browser.Quit(); } Setup
  46. [Test] public void one_method_to_rule_them_all() { var profile = new FirefoxProfile();

    var exe = new FirefoxBinary(@"D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); IWebDriver browser = new FirefoxDriver(exe, profile); WebDriverWait w = new WebDriverWait(browser,TimeSpan.FromSeconds(10)); browser.Navigate().GoToUrl("http://localhost/AJAXDemos/CascadingDropDown/CascadingDropDown.aspx"); //browser.Navigate().GoToUrl("http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList1')/option[text()='Acura']"))); var sl =browser.FindElement(By.Id("ctl00_SampleContent_DropDownList1")); var l = new SelectElement(sl); l.SelectByText("Acura"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList2')/option[text()='Integra']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList2")); l = new SelectElement(sl); l.SelectByText("Integra"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList3')/option[text()='Sea Green']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList3")); l = new SelectElement(sl); l.SelectByText("Sea Green"); w.Until(ExpectedConditions.ElementExists(By.XPath("//span[@id='ctl00_SampleContent_Label1' and text()='You have chosen a Sea Green Acura Integra. Nice car!']"))); browser.Quit(); } Commented Out Code!
  47. [Test] public void one_method_to_rule_them_all() { var profile = new FirefoxProfile();

    var exe = new FirefoxBinary(@"D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); IWebDriver browser = new FirefoxDriver(exe, profile); WebDriverWait w = new WebDriverWait(browser,TimeSpan.FromSeconds(10)); browser.Navigate().GoToUrl("http://localhost/AJAXDemos/CascadingDropDown/CascadingDropDown.aspx"); //browser.Navigate().GoToUrl("http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList1')/option[text()='Acura']"))); var sl =browser.FindElement(By.Id("ctl00_SampleContent_DropDownList1")); var l = new SelectElement(sl); l.SelectByText("Acura"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList2')/option[text()='Integra']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList2")); l = new SelectElement(sl); l.SelectByText("Integra"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList3')/option[text()='Sea Green']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList3")); l = new SelectElement(sl); l.SelectByText("Sea Green"); w.Until(ExpectedConditions.ElementExists(By.XPath("//span[@id='ctl00_SampleContent_Label1' and text()='You have chosen a Sea Green Acura Integra. Nice car!']"))); browser.Quit(); } Duplication
  48. [Test] public void one_method_to_rule_them_all() { var profile = new FirefoxProfile();

    var exe = new FirefoxBinary(@"D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); IWebDriver browser = new FirefoxDriver(exe, profile); WebDriverWait w = new WebDriverWait(browser,TimeSpan.FromSeconds(10)); browser.Navigate().GoToUrl("http://localhost/AJAXDemos/CascadingDropDown/CascadingDropDown.aspx"); //browser.Navigate().GoToUrl("http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList1')/option[text()='Acura']"))); var sl =browser.FindElement(By.Id("ctl00_SampleContent_DropDownList1")); var l = new SelectElement(sl); l.SelectByText("Acura"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList2')/option[text()='Integra']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList2")); l = new SelectElement(sl); l.SelectByText("Integra"); w.Until(ExpectedConditions.ElementExists(By.XPath("id('ctl00_SampleContent_DropDownList3')/option[text()='Sea Green']"))); sl = browser.FindElement(By.Id("ctl00_SampleContent_DropDownList3")); l = new SelectElement(sl); l.SelectByText("Sea Green"); w.Until(ExpectedConditions.ElementExists(By.XPath("//span[@id='ctl00_SampleContent_Label1' and text()='You have chosen a Sea Green Acura Integra. Nice car!']"))); browser.Quit(); } Can you read this? No? Didn’t think so.
  49. None
  50. Testable User Interfaces

  51. None
  52. None
  53. None
  54. Better Testing

  55. Testers can help Devs

  56. Improved acceptance criteria

  57. Good Test Case design

  58. Payroll System: Rate * Hours == Wages Hours > 40

    == Hours* 1.5
  59. 40 hours, 5 rate == 200 41 hours, 5 rate

    == 207.5 DONE! Dev Tester What about zero? Fine. 40 hours, 5 rate == 200 41 hours, 5 rate == 207.5 0 hours, 5 rate == 0 1 hour, 0 rate == 0 What about negatives? Whatever. 40 hours, 5 rate == 200 41 hours, 5 rate == 207.5 0 hours, 5 rate == 0 1 hour, 0 rate == 0 -1 hour, 1 rate == Exception 1 hour, -1 rate == Exception What about changing rates during period?
  60. Dev Tester Go away

  61. Better error handling

  62. None
  63. Better test coverage

  64. Testing Pyramid -- Permission from Lisa Crispin Exploratory

  65. Better Value

  66. Feature value

  67. None
  68. None
  69. Earlier Communication

  70. None
  71. Faster feedback, better flow

  72. None
  73. Why Collaborate?

  74. Better Technology

  75. Better Testing

  76. Better Value

  77. Why do testers avoid automation?

  78. Jim Holmes @aJimHolmes Jim@GuidepostSystems.com FrazzledDad.com