Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Polyglot Automation - Miami - 2016

380 views

Published on

Slides for the talk given on South Florida Software Testing meetup (https://www.meetup.com/South-Florida-Software-Testing/events/233980212) about choosing a programming language for you test automation project.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Polyglot Automation - Miami - 2016

  1. 1. Polyglot Automation @yashakaautomician.com 12.2016
  2. 2. Preface… @yashaka
  3. 3. What Language?
  4. 4. Automation = Automating manual routine work
  5. 5. Automation => QA 
 ???
  6. 6. Effective Automation => QA
  7. 7. Polyglot Automation = Using Any Language to make it Effective
  8. 8. Effective Automation *= with Backend Language Web UI
  9. 9. Why?
  10. 10. Developers can help with implementation Easier for devs to use and support tests Smaller Tech Stack. No Zoo at project :) And…
  11. 11. Allows to use fast & efficient test data pre-setup!
  12. 12. Demo
  13. 13. Full coverage for TodoMVC: Without “backend” preconditions: 22s With “backend” preconditions: 17s => optimised for 23%
  14. 14. A remark TodoMVC is very simple app with small light-weight “preconditions” in tests Real app will usually have much more “hard-weight” preconditions So the optimisation may be much bigger
  15. 15. But it’s hard, no?
  16. 16. Hard to: learn new language… use statically typed Java/C# over dynamic Python/ Ruby… ?
  17. 17. No:p
  18. 18. No:p if you use “easy tools” ;)
  19. 19. Examples
  20. 20. Tests
  21. 21. public class TodoMVCTest {
 
 @Test
 public void testFilterTasks(){
 Tasks.visit();
 
 Tasks.add("a", "b", "c");
 Tasks.shouldBe("a", "b", "c");
 
 Tasks.toggle("b");
 
 Tasks.filterActive ();
 Tasks.shouldBe("a", "c");
 
 Tasks.filterCompleted ();
 Tasks.shouldBe("b");
 }
 }
  22. 22. [TestFixture ()]
 public class Test : BaseTest
 {
 [Test ()]
 public void FilterTasks ()
 {
 Tasks.Visit ();
 
 Tasks.Add ("a", "b", "c");
 Tasks.ShouldBe ("a", "b", "c");
 
 Tasks.Toggle ("b"); 
 
 Tasks.FilterActive ();
 Tasks.ShouldBe ("a", "c");
 
 Tasks.FilterCompleted ();
 Tasks.ShouldBe ("b");
 }
 }
  23. 23. class TestTodoMVC(BaseTest):
 
 def test_filter_tasks(self):
 
 tasks.visit()
 
 tasks.add("a", "b", "c")
 tasks.should_be("a", "b", "c")
 
 tasks.toggle("b")
 
 tasks.filter_active ()
 tasks.should_be("a", "c")
 
 tasks.filter_completed ()
 tasks.should_be("b")
  24. 24. describe "todomvc" do 
 it "filters tasks" do
 Tasks.open
 Tasks.add "a", "b", "c"
 Tasks.should_be "a", "b", "c"
 
 Tasks.toggle "b"
 
 Tasks.filter_active
 Tasks.should_be "a", "c"
 
 Tasks.filter_completed
 Tasks.should_be "b"
 end
 end
  25. 25. Helpers simpler
  26. 26. public class Tasks {
 
 ...
 public static void visit() { 
 open("https: //todomvc4tasj.herokuapp.com/");
 }
 
 public static void filterActive(){ 
 $(By.linkText("Active")).click();
 }
 
 public static void filterCompleted(){ 
 $(By.linkText("Completed")).click();
 }
 
 public static void add(String ... taskTexts) { 
 for(String text: taskTexts){ 
 $("#new-todo").setValue(text).pressEnter();
 }
 } ...
 }
  27. 27. public static class Tasks
 {
 ... 
 public static void Visit()
 {
 Open("https: //todomvc4tasj.herokuapp.com/");
 }
 
 public static void FilterActive()
 {
 S(By.LinkText("Active")).Click();
 }
 
 public static void FilterCompleted()
 {
 S(By.LinkText("Completed")).Click();
 }
 
 public static void Add(params string [] taskTexts)
 {
 foreach(var text in taskTexts) 
 {
 S("#new-todo").SetValue(text).PressEnter();
 }
 } ...
 }
  28. 28. … def visit():
 
 tools.visit("https: //todomvc4tasj.herokuapp.com/")
 
 
 def filter_active():
 
 s(by_link_text("Active")).click()
 
 
 def filter_completed():
 
 s(by_link_text("Completed")).click()
 
 
 def add(*task_texts):
 
 for text in task_texts: 
 s("#new-todo").set_value(text).press_enter()
  29. 29. module Tasks
 extend Capybara ::DSL
 def self.open 
 visit 'https: //todomvc4tasj.herokuapp.com'
 end 
 def self.filter_active 
 find("a", text:"Active").click
 end
 
 def self.filter_completed 
 find("a", text:"Completed").click
 end
 
 def self.add *task_texts 
 task_texts.each do |text| 
 find("#new-todo").send_keys(text, :enter)
 end
 end
 
 ...
 end
  30. 30. Helpers a bit harder
  31. 31. public class Tasks {
 
 public static ElementsCollection tasks = $$("#todo-list>li");
 
 ... 
 public static void toggle(String taskText) { 
 tasks.findBy(exactText(taskText)).find(".toggle").click();
 }
 
 public static void shouldBe(String ... taskTexts) { 
 tasks.filterBy(visible).shouldHave(exactTexts(taskTexts));
 }
 }
  32. 32. public static class Tasks
 {
 public static SCollection List = SS("#todo-list>li"); 
 
 ...
 
 public static void Toggle (string taskText)
 {
 List.FindBy(Have.ExactText(taskText)).Find(".toggle").Click();
 }
 
 public static void ShouldBe(params string [] names) {
 List.FilterBy(Be.Visible).Should(Have.Texts(names));
 }
 }
  33. 33. tasks = ss("#todo-list>li")
 
 ... def toggle(task_text):
 
 tasks.findBy(exact_text(task_text)).find(".toggle").click()
 
 
 def should_be(*task_texts):
 
 tasks.filterBy(visible).should_have(exact_texts(*task_texts))
  34. 34. module Tasks
 extend Capybara ::DSL
 
 def self.tasks
 all "#todo-list>li"
 end 
 ...
 def self.toggle task_text 
 (tasks.findBy {|task| task.text == task_text}).find(".toggle").click
 end
 
 def self.should_be *task_texts 
 tasks.texts.should == task_texts
 end
 end
  35. 35. Easy?
  36. 36. Easy Tools?
  37. 37. Java: Selenide Python: Selene is coming… C#: NSelene is coming… Ruby: Capybara ? JavaScript: Protractor ? PHP: Codeception
  38. 38. No ready Easy Tool for your language? Lack of knowledge? => ask project’s developers to write it for you Brave? => implement it by your own
  39. 39. How to become polyglot automation engineer? Just learn ONE Language perfectly. Then Don’t be afraid to switch to other when it fits better
  40. 40. Learn next language learnxinyminutes.com +
 koans + practice solving common tasks like exercism.io + google.com
  41. 41. Afterwords There are good practices in context, but there are no best practices. (c) Cem Kaner, James Bach
  42. 42. Q&A
  43. 43. github.com/yashaka facebook/yashaka twitter.com/yashaka yashaka@gmail.com automician.com seleniumcourses.com Thank you @yashaka12.2016

×