Polyglot Automation - Miami - 201610. Developers can help with implementation
Easier for devs to use and support tests
Smaller Tech Stack. No Zoo at project :)
And…
14. Full coverage for TodoMVC:
Without “backend” preconditions: 22s
With “backend” preconditions: 17s
=> optimised for 23%
15. 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
17. Hard to:
learn new language…
use statically typed Java/C# over dynamic Python/
Ruby…
?
23. 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");
}
}
24. [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");
}
}
26. 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
28. 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();
}
}
...
}
29. 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();
}
}
...
}
31. 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
33. 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));
}
}
34. 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));
}
}
35. 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))
36. 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
40. 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
41. How to become polyglot
automation engineer?
Just learn ONE Language perfectly.
Then
Don’t be afraid to switch to other when it fits better