automated testing of web applications
TRANSCRIPT
A G E N D A
• Software testing in general
• Architecting for testability
• Testing web UIs
• What should I do?
A G E N D A
• Software testing in general
• Architecting for testability
• Testing web UIs
• What should I do?
– J O H N D O E V E L O P E R
“Unit testing is a waste of time, because the tests don't prove that things work correctly”
1. You will ALWAYS have code that worked a minute ago
2. You will have more and more automatic tests that can be run all the time
3. You will have usage examples for all of your code and API
4. All your code will be testable by default
Scenario 1: Account has sufficient funds Given the account balance is \$100 And the card is valid And the machine contains enough money When the Account Holder requests \$20 Then the ATM should dispense \$20 And the account balance should be \$80 And the card should be returned
1. Easy to define end-to-end behavior to be tested
2. Business value easily translates to this format
3. You're probably already defining user stories
A G E N D A
• Software testing in general
• Architecting for testability
• Testing web UIs
• What should I do?
• Cross browser differences
• Logic that depends on the DOM
• Asynchronous execution
• Possibly slow execution
A G E N D A
• Software testing in general
• Architecting for testability
• Testing web UIs
• What should I do?
Narrative:As a userI want to perform calculationsSo that I can easily get the results without calculating in my headScenario: Calculate 1+2Given I have the calculator openWhen I push 1+2Then the result should be 3.0
public class CalculatorSteps extends TestBenchTestCase { private WebDriver driver; private CalculatorPageObject calculator; @BeforeScenario public void setUpWebDriver() { driver = TestBench.createDriver(new FirefoxDriver()); calculator = PageFactory.initElements(driver, CalculatorPageObject.class); } @AfterScenario public void tearDownWebDriver() { driver.quit(); }
@Given("I have the calculator open") public void theCalculatorIsOpen() { calculator.open(); } @When("I push $buttons") public void enter(String buttons) { calculator.enter(buttons); } @Then("the result should be $result") public void assertResult(String result) { assertEquals(result, calculator.getResult()); } }
public class SimpleCalculation extends JUnitStory { @Override public Configuration configuration() { return new MostUsefulConfiguration() .useStoryLoader(new LoadFromClasspath(this.getClass())) .useStoryReporterBuilder(new StoryReporterBuilder() .withDefaultFormats() .withFormats(Format.CONSOLE, Format.TXT)); } @Override public InjectableStepsFactory stepsFactory() { return new InstanceStepsFactory(configuration(), new CalculatorSteps()); }}
A G E N D A
• Software testing in general
• Architecting for testability
• Testing web UIs
• What should I do?
I M A G E S U S E D
• https://flic.kr/p/671Z4A
• https://flic.kr/p/bsozXc
• https://flic.kr/p/hRfBC
• https://flic.kr/p/nQ7ac5
• https://flic.kr/p/8sf5Xt
• https://flic.kr/p/4LH5Eo
• https://flic.kr/p/7Lx9Kk
• https://flic.kr/p/nAi4GZ
• https://flic.kr/p/eguHX8
• https://flic.kr/p/4fmu9E
• https://flic.kr/p/dtSHid
• https://flic.kr/p/bwpVQ7
• https://flic.kr/p/fGyo6Q