SlideShare a Scribd company logo
KISS Automation
@yashakaitlabs.net.ua
Afterwords
There are good practices in context,
but there are no best practices.
(c) Cem Kaner, James Bach
Afterwords Preface
There are good practices in context,
but there are no best practices.
(c) Cem Kaner, James Bach
KISS?
Keep It Simple Stupid!
Web UI Automation…
Selenium vs Wrappers
Wait for text
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(textToBePresentInElement(page.element, ":-*"));
Wait for text
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(textToBePresentInElement(page.element, ":-*"));
Wait for text
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
Wait for text
Wait for text
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));
Not mandatory, still possible…
Not mandatory, still possible…
public class ExamplePage{

WebElement element = $(“#element");

}
...
ExamplePage page = new ExamplePage();


page.element.shouldHave(text(":-*"));
WrappersSelenium
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));vs
WrappersSelenium
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));vs
WrappersSelenium
Test logic
Test logic messed up
with tech details
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));vs
WrappersSelenium
Test logic
Test logic messed up
with tech details
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));vs
WrappersSelenium
may be SlowerFast
public class ExamplePage{

@FindBy(css = "#element")

WebElement element;

}
...
WebDriver driver = new FirefoxDriver();

ExamplePage page = PageFactory.initElements(
driver, ExamplePage.class);



(new WebDriverWait(driver, 6)).until(
textToBePresentInElement(page.element, ":-*"));
SelenideElement element = $(“#element");
...

element.shouldHave(text(":-*"));vs
WrappersSelenium
may be SlowerFast
End to End vs “Unit”
def test_task_life_cycle():

given_at_todomvc()

add("a")

edit("a", "a edited")

toggle("a edited")

filter_active()

assert_no_tasks()

filter_completed()

delete("a edited")

assert_no_tasks()

#...
End to End Scenario
def test_task_life_cycle():

given_at_todomvc()

add("a")

edit("a", "a edited")

toggle("a edited")

filter_active()

assert_no_tasks()

filter_completed()

delete("a edited")

assert_no_tasks()

#...
End to End Scenario
implicit
checks
“Unit” / “1-feature-per-test” style
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_delete():

given_at_todomvc("a", "b", "c")

delete("b")

assert_tasks("a", "c")
assert_items_left(2)
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_delete():

given_at_todomvc("a", "b", "c")

delete("b")

assert_tasks("a", "c")
assert_items_left(2)
def test_edit():

given_at_todomvc("a", "b", "c")

edit("c", "c edited")

assert_tasks("a", "b", "c edited")
assert_items_left(3)
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_delete():

given_at_todomvc("a", "b", "c")

delete("b")

assert_tasks("a", "c")
assert_items_left(2)
def test_edit():

given_at_todomvc("a", "b", "c")

edit("c", "c edited")

assert_tasks("a", "b", "c edited")
assert_items_left(3)
def test_toggle():

#...
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_delete():

given_at_todomvc("a", "b", "c")

delete("b")

assert_tasks("a", "c")
assert_items_left(2)
def test_edit():

given_at_todomvc("a", "b", "c")

edit("c", "c edited")

assert_tasks("a", "b", "c edited")
assert_items_left(3)
def test_toggle():

#...
#...
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
“Unit” / “1-feature-per-test” style
def test_delete():

given_at_todomvc("a", "b", "c")

delete("b")

assert_tasks("a", "c")
assert_items_left(2)
def test_edit():

given_at_todomvc("a", "b", "c")

edit("c", "c edited")

assert_tasks("a", "b", "c edited")
assert_items_left(3)
def test_toggle():

#...
#...
“Unit”/“Feature”E2E
vs
“Unit”/“Feature”E2E
def test_task_life_cycle():

given_at_todomvc()

add("a")

edit("a", "a edited")

toggle("a edited")

filter_active()

assert_no_tasks()

filter_completed()

delete("a edited")

assert_no_tasks()

#...
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
def test_delete():

#...
#...
vs
“Unit”/“Feature”E2E
SimpleEasy
def test_task_life_cycle():

given_at_todomvc()

add("a")

edit("a", "a edited")

toggle("a edited")

filter_active()

assert_no_tasks()

filter_completed()

delete("a edited")

assert_no_tasks()

#...
def test_add():

given_at_todomvc()

add("a", "b")

assert_tasks("a", "b")
assert_items_left(2)
def test_delete():

#...
#...
Simple is not Easy
–Rich Hickey
“Simple Made Easy”
“Unit”/“Feature”E2E
vs
“Unit”/“Feature”E2E
+ more coverage
+ in less time
+ in case of bugs, gives
more complete report
+ easier to identify reason
from the report
=>
+ less time and efforts in
support
+ with less efforts during
POC implementation
+ integration coverage
vs
“Unit”/“Feature”E2E
SimpleEasy
+ more coverage
+ in less time
+ in case of bugs, gives
more complete report
+ easier to identify reason
from the report
=>
+ less time and efforts in
support
+ with less efforts during
POC implementation
+ integration coverage
vs
“Unit”/“Feature”E2E
SimpleEasy
+ more coverage
+ in less time
+ in case of bugs, gives
more complete report
+ easier to identify reason
from the report
=>
+ less time and efforts in
support
+ with less efforts during
POC implementation
+ integration coverage
vs
“Unit”/“Feature”E2E
SimpleEasy
+ more coverage
+ in less time
+ in case of bugs, gives
more complete report
+ easier to identify reason
from the report
=>
+ less time and efforts in
support
+ with less efforts during
POC implementation
+ integration coverage
vs Simple“Pretty”
Reports
public class TodoMVCTest {



@Test

public void testTaskLifeCycle(){

givenAtTodoMVC();

add("a");

toggle("a");

filterActive();

assertNoTasks();

filterCompleted();

edit("a", "a edited");

toggle("a edited");

assertNoTasks();

//...

}
@Test

public void testAddTasks(){

givenAtTodoMVC();

add("a", "b", "c");

assertTasks("a", "b", "c");

assertItemsLeft(3);

}

@Test

public void testDeleteTask(){

givenAtTodoMVC("a", "b", "c");

delete("b");

assertTasks("a", "c");

assertItemsLeft(2);

}

//...

}
Simple
<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.18.1</version>

<configuration>

<argLine>

-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-$
{aspectj.version}.jar"

</argLine>

<properties>

<property>

<name>listener</name>

<value>ru.yandex.qatools.allure.junit.AllureRunListener</value>

</property>

</properties>

</configuration>

<dependencies>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>${aspectj.version}</version>

</dependency>

</dependencies>

</plugin>
Allure reporting
<reporting>

<excludeDefaults>true</excludeDefaults>

<plugins>

<plugin>

<groupId>ru.yandex.qatools.allure</groupId>

<artifactId>allure-maven-plugin</artifactId>

<version>2.0</version>

</plugin>

</plugins>

</reporting>
@Step

public static void add(String... taskTexts) {

for(String text: taskTexts){

newTodo.setValue(text).pressEnter();

}

}



@Step

public static void filterActive(){

$(By.linkText("Active")).click();

}

//...
Allure reporting
“Pretty” with Allure
vs
SimplePretty
SimpleMore configs & annotations
Reporting
vs
SimplePretty
Enough for “Unit”Good for E2E
Reporting
BDD vs xUnit
BDD
BDD
xUnitBDD
vs
xUnitBDD
1. Write scenarios with steps
2. Define steps
2.1 Introduce state
3. Map steps
4. Configure Runner
5. Run
6. Get pretty reports
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
vs
xUnitBDD
1. Write scenarios with steps
2. Define steps
2.1 Introduce state
3. Map steps
4. Configure Runner
5. Run
6. Get pretty reports
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Simple & Easy? :)
1. Write scenarios with steps
2. Define steps
2.1 Introduce state
3. Map steps
4. Configure Runner
5. Run
6. Get pretty reports
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Simple & Easy? :)
1. Write scenarios with steps
2. Define steps
2.1 Introduce state
3. Map steps
4. Configure Runner
5. Run
6. Get pretty reports
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Less coding,
Full power of PL
No vars & return from steps
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Less coding,
Full power of PL
No vars & return from steps
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Less coding,
Full power of PL
Monkeys-friendly
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
vs
xUnitBDD
Less coding,
Full power of PL
Monkeys-friendly
1. Write tests with steps
2. Define steps
3. Run
4. Get reports
still pretty with Allure
PageModules
vs
PageObjects
PageModules
vs
ModularOOP
PageObjects
from pages import tasks
def test_filter_tasks():


tasks.visit()

tasks.add("a", "b", "c")

tasks.should_be("a", "b", "c")



...
from pages.tasks import TasksPage
def test_filter_tasks():
tasks = TasksPage()


tasks.visit()

tasks.add("a", "b", "c")

tasks.should_be("a", "b", "c")



...
PageModulesPageObjects
ModularOOP
class TasksPage:
def __init__(self):
self.tasks = ss("#todo-list>li")



def visit(self):

tools.visit('https://todomvc4tasj.herokuapp.com/')
...
def should_be(self, *task_texts):

self.tasks.filterBy(visible).should_have(exact_texts(*task_texts))

...
PageObjects
OOP
#tasks.py
tasks = ss("#todo-list>li")



def visit():

tools.visit('https://todomvc4tasj.herokuapp.com/')
...
def should_be(*task_texts):

tasks.filterBy(visible).should_have(exact_texts(*task_texts))

...
PageModules
Modular
PageModules
vs
ModularOOP
PageObjects
PageModules
vs
ModularOOP
PageObjects
+ simple
+ easy
+ “newbies” friendly
PageModules
vs
ModularOOP
PageObjects
+ ? + simple
+ easy
+ “newbies” friendly
PageModules
vs
ModularOOP
PageObjects
+ ? + simple
+ easy
+ “newbies” friendly
+ parallelised tests
PageModules
vs
ModularOOP
PageObjects
+ ? + simple
+ easy
+ “newbies” friendly
+ parallelised tests
(where there is no automatic
driver management per
thread)
Pages
of Widgets
vs
Plain
Pages
Pages
of Widgets
vs
OOP
Modular/
Procedural
Plain
Pages
OOP
Pages of “plural” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")



main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))
OOP
Pages of “plural” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")



main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))
OOP
Pages of “plural” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")



main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))
OOP
Pages as Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")



main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
OOP
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self
Pages (as widgets) of “plural” Widgets: Implementation
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)


def clear_completed(self):

s(“#clear-completed").click()

return self



class Task(SElement):

def toggle(self):

self.s(".toggle").click()

return self OOP
Plain Pages: Usage
import tasks
def test_nested_custom_selements():

given_active("a", "b")



tasks.toggle("b")

tasks.clear_completed()

tasks.shouldBe("a")
Procedural
Plain Pages: Usage
import tasks
def test_nested_custom_selements():

given_active("a", "b")



tasks.toggle("b")

tasks.clear_completed()

tasks.shouldBe("a")
Procedural
Plain Pages: Implementation
#tasks.py
tasks = ss("#todo-list>li")



def toggle(task_text):

tasks.findBy(exact_text(task_text).s(".toggle").click()
...
def should_be(*task_texts):

tasks.filterBy(visible).should_have(exact_texts(*task_texts))

...
Procedural
OOP
Pages of “singular” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")

main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))

main.footer.assure_items_left(1)
OOP
Pages of “singular” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")

main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))

main.footer.assure_items_left(1)
OOP
Pages of “singular” Widgets: Usage
def test_nested_custom_selements():

given_active("a", "b")



main = TodoMVC("#todoapp")

main.tasks.find(text("b")).toggle()

main.clear_completed()

main.tasks.assure(texts("a"))

main.footer.assure_items_left(1)
OOP
Pages of “singular” Widgets: Implementation
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)

self.footer = self.Footer("#footer")



...



class Footer(SElement):

def init(self):

self.clear_completed = self.s("#clear-completed")



def assure_items_left(self, number_of_active_tasks):

self.s("#todo-
count>strong").assure(exact_text(str(number_of_active_tasks)))
OOP
Pages of “singular” Widgets: Implementation
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)

self.footer = self.Footer("#footer")



...



class Footer(SElement):

def init(self):

self.clear_completed = self.s("#clear-completed")



def assure_items_left(self, number_of_active_tasks):

self.s("#todo-
count>strong").assure(exact_text(str(number_of_active_tasks)))
Pages of “singular” Widgets: Implementation
class TodoMVC(SElement):

def init(self):

self.tasks = ss("#todo-list>li").of(self.Task)

self.footer = self.Footer("#footer")



...



class Footer(SElement):

def init(self):

self.clear_completed = self.s("#clear-completed")



def assure_items_left(self, number_of_active_tasks):

self.s("#todo-
count>strong").assure(exact_text(str(number_of_active_tasks)))
Plain Pages: Usage
def test_nested_custom_selements():

given_active("a", "b")



tasks.toggle("b")

tasks.clear_completed()

tasks.shouldBe(“a")
footer.assert_items_left(1)
Modular
Plain Pages: Implementation
#tasks.py
tasks = ss("#todo-list>li")



def toggle(task_text):

tasks.findBy(exact_text(task_text).s(".toggle").click()
...
Modular
#footer.py
def assure_items_left(self, number_of_active_tasks):

s("#todo-count>strong").assure(exact_text(str(number_of_active_tasks)))
...
Plain Pages
vs
Procedural/ModularOOP
Pages with Widgets
Plain Pages
vs
Procedural/ModularOOP
Pages with Widgets
+ simple
+ easy
+ “newbies” friendly
+ less code
+ visible
Plain Pages
vs
Procedural/ModularOOP
Pages with Widgets
+ ?
+ simple
+ easy
+ “newbies” friendly
+ less code
+ visible
Plain Pages
vs
Procedural/ModularOOP
Pages with Widgets
+ ?
+ simple
+ easy
+ “newbies” friendly
+ less code
+ visible
+ for complex UI with many
“plural” widgets
Afterwords
There are good practices in context,
but there are no best practices.
(c) Cem Kaner, James Bach
Q&A
Thank you!
github.com/yashaka
slideshare.net/yashaka
gitter.im/yashaka/better-selenium
youtube.com/c/ItlabsNetUa
@yashakaitlabs.net.ua

More Related Content

What's hot

Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
Frank de Jonge
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the testsPHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
Michelangelo van Dam
 
Deploying Straight to Production
Deploying Straight to ProductionDeploying Straight to Production
Deploying Straight to Production
Mark Baker
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and you
markstory
 
Testing untestable code - DPC10
Testing untestable code - DPC10Testing untestable code - DPC10
Testing untestable code - DPC10
Stephan Hochdörfer
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
CiaranMcNulty
 
SCULPT! YOUR! TESTS!
SCULPT! YOUR! TESTS!SCULPT! YOUR! TESTS!
SCULPT! YOUR! TESTS!
Taras Oleksyn
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
guest5d87aa6
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
Michelangelo van Dam
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
noelrap
 
Тестирование и Django
Тестирование и DjangoТестирование и Django
Тестирование и Django
MoscowDjango
 
How to write easy-to-test JavaScript
How to write easy-to-test JavaScriptHow to write easy-to-test JavaScript
How to write easy-to-test JavaScript
Ynon Perek
 
QA for PHP projects
QA for PHP projectsQA for PHP projects
QA for PHP projects
Michelangelo van Dam
 
Crafting [Better] API Clients
Crafting [Better] API ClientsCrafting [Better] API Clients
Crafting [Better] API Clients
Wellfire Interactive
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007
Rabble .
 
Why Your Test Suite Sucks - PHPCon PL 2015
Why Your Test Suite Sucks - PHPCon PL 2015Why Your Test Suite Sucks - PHPCon PL 2015
Why Your Test Suite Sucks - PHPCon PL 2015
CiaranMcNulty
 
Proposed PHP function: is_literal()
Proposed PHP function: is_literal()Proposed PHP function: is_literal()
Proposed PHP function: is_literal()
Craig Francis
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
Nascenia IT
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
Tarek Yehia
 

What's hot (19)

Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the testsPHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
 
Deploying Straight to Production
Deploying Straight to ProductionDeploying Straight to Production
Deploying Straight to Production
 
PHPunit and you
PHPunit and youPHPunit and you
PHPunit and you
 
Testing untestable code - DPC10
Testing untestable code - DPC10Testing untestable code - DPC10
Testing untestable code - DPC10
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
 
SCULPT! YOUR! TESTS!
SCULPT! YOUR! TESTS!SCULPT! YOUR! TESTS!
SCULPT! YOUR! TESTS!
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Тестирование и Django
Тестирование и DjangoТестирование и Django
Тестирование и Django
 
How to write easy-to-test JavaScript
How to write easy-to-test JavaScriptHow to write easy-to-test JavaScript
How to write easy-to-test JavaScript
 
QA for PHP projects
QA for PHP projectsQA for PHP projects
QA for PHP projects
 
Crafting [Better] API Clients
Crafting [Better] API ClientsCrafting [Better] API Clients
Crafting [Better] API Clients
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007
 
Why Your Test Suite Sucks - PHPCon PL 2015
Why Your Test Suite Sucks - PHPCon PL 2015Why Your Test Suite Sucks - PHPCon PL 2015
Why Your Test Suite Sucks - PHPCon PL 2015
 
Proposed PHP function: is_literal()
Proposed PHP function: is_literal()Proposed PHP function: is_literal()
Proposed PHP function: is_literal()
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 

Viewers also liked

Selenium With Spices
Selenium With SpicesSelenium With Spices
Selenium With Spices
Nikolajs Okunevs
 
Allure framework
Allure frameworkAllure framework
Allure framework
artkoshelev
 
Allure framework. Пример настройки исчерпывающего репорта на реальном проекте
Allure framework. Пример настройки исчерпывающего репорта на реальном проектеAllure framework. Пример настройки исчерпывающего репорта на реальном проекте
Allure framework. Пример настройки исчерпывающего репорта на реальном проекте
COMAQA.BY
 
Selenium Conference 2015 - Mobile Selenium Grid Setup
Selenium Conference 2015 - Mobile Selenium Grid SetupSelenium Conference 2015 - Mobile Selenium Grid Setup
Selenium Conference 2015 - Mobile Selenium Grid Setup
Justin Ison
 
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
COMAQA.BY
 
Write Selenide in Python 15 min
Write Selenide in Python 15 minWrite Selenide in Python 15 min
Write Selenide in Python 15 min
Iakiv Kramarenko
 
How To Use Selenium Successfully (Java Edition)
How To Use Selenium Successfully (Java Edition)How To Use Selenium Successfully (Java Edition)
How To Use Selenium Successfully (Java Edition)
Sauce Labs
 
Automation is Easy! (python version)
Automation is Easy! (python version)Automation is Easy! (python version)
Automation is Easy! (python version)
Iakiv Kramarenko
 
Appium: Automation for Mobile Apps
Appium: Automation for Mobile AppsAppium: Automation for Mobile Apps
Appium: Automation for Mobile Apps
Sauce Labs
 

Viewers also liked (9)

Selenium With Spices
Selenium With SpicesSelenium With Spices
Selenium With Spices
 
Allure framework
Allure frameworkAllure framework
Allure framework
 
Allure framework. Пример настройки исчерпывающего репорта на реальном проекте
Allure framework. Пример настройки исчерпывающего репорта на реальном проектеAllure framework. Пример настройки исчерпывающего репорта на реальном проекте
Allure framework. Пример настройки исчерпывающего репорта на реальном проекте
 
Selenium Conference 2015 - Mobile Selenium Grid Setup
Selenium Conference 2015 - Mobile Selenium Grid SetupSelenium Conference 2015 - Mobile Selenium Grid Setup
Selenium Conference 2015 - Mobile Selenium Grid Setup
 
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
COMAQA.BY Conf #2: “Настройка Allure при использовании TestNG-Retry, Антон Ем...
 
Write Selenide in Python 15 min
Write Selenide in Python 15 minWrite Selenide in Python 15 min
Write Selenide in Python 15 min
 
How To Use Selenium Successfully (Java Edition)
How To Use Selenium Successfully (Java Edition)How To Use Selenium Successfully (Java Edition)
How To Use Selenium Successfully (Java Edition)
 
Automation is Easy! (python version)
Automation is Easy! (python version)Automation is Easy! (python version)
Automation is Easy! (python version)
 
Appium: Automation for Mobile Apps
Appium: Automation for Mobile AppsAppium: Automation for Mobile Apps
Appium: Automation for Mobile Apps
 

Similar to QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"

KISS Automation.py
KISS Automation.pyKISS Automation.py
KISS Automation.py
Iakiv Kramarenko
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
Allegient
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 
Writing HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAEWriting HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAE
Ron Reiter
 
Revolution or Evolution in Page Object
Revolution or Evolution in Page ObjectRevolution or Evolution in Page Object
Revolution or Evolution in Page Object
Artem Sokovets
 
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Raimonds Simanovskis
 
jQuery
jQueryjQuery
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
Peter Drinnan
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
Iakiv Kramarenko
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
Artem Nagornyi
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
toddbr
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Thomas Fuchs
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
ghnash
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
pootsbook
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
Alessandro Molina
 
J query training
J query trainingJ query training
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
Narendra Dabhi
 
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Leonardo Soto
 
jQuery, CSS3 and ColdFusion
jQuery, CSS3 and ColdFusionjQuery, CSS3 and ColdFusion
jQuery, CSS3 and ColdFusion
Denard Springle IV
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
Marakana Inc.
 

Similar to QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation" (20)

KISS Automation.py
KISS Automation.pyKISS Automation.py
KISS Automation.py
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Writing HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAEWriting HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAE
 
Revolution or Evolution in Page Object
Revolution or Evolution in Page ObjectRevolution or Evolution in Page Object
Revolution or Evolution in Page Object
 
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
 
jQuery
jQueryjQuery
jQuery
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
 
J query training
J query trainingJ query training
J query training
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
 
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
 
jQuery, CSS3 and ColdFusion
jQuery, CSS3 and ColdFusionjQuery, CSS3 and ColdFusion
jQuery, CSS3 and ColdFusion
 
2010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-62010 07-18.wa.rails tdd-6
2010 07-18.wa.rails tdd-6
 

More from GeeksLab Odessa

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
GeeksLab Odessa
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
GeeksLab Odessa
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторDataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
GeeksLab Odessa
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеDataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
GeeksLab Odessa
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
GeeksLab Odessa
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
GeeksLab Odessa
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
GeeksLab Odessa
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
GeeksLab Odessa
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
GeeksLab Odessa
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
GeeksLab Odessa
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
GeeksLab Odessa
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
GeeksLab Odessa
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
GeeksLab Odessa
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
GeeksLab Odessa
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
GeeksLab Odessa
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
GeeksLab Odessa
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
GeeksLab Odessa
 

More from GeeksLab Odessa (20)

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторDataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеDataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
 

Recently uploaded

GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
kalichargn70th171
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !
Marcin Chrost
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
Yara Milbes
 
Oracle 23c New Features For DBAs and Developers.pptx
Oracle 23c New Features For DBAs and Developers.pptxOracle 23c New Features For DBAs and Developers.pptx
Oracle 23c New Features For DBAs and Developers.pptx
Remote DBA Services
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
Remote DBA Services
 
Top 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptxTop 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptx
devvsandy
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
sjcobrien
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
Rakesh Kumar R
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
UI5con 2024 - Bring Your Own Design System
UI5con 2024 - Bring Your Own Design SystemUI5con 2024 - Bring Your Own Design System
UI5con 2024 - Bring Your Own Design System
Peter Muessig
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
Ayan Halder
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
Bert Jan Schrijver
 
zOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL DifferenceszOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL Differences
YousufSait3
 
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
XfilesPro
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
Quickdice ERP
 

Recently uploaded (20)

GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
 
Oracle 23c New Features For DBAs and Developers.pptx
Oracle 23c New Features For DBAs and Developers.pptxOracle 23c New Features For DBAs and Developers.pptx
Oracle 23c New Features For DBAs and Developers.pptx
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
 
Top 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptxTop 9 Trends in Cybersecurity for 2024.pptx
Top 9 Trends in Cybersecurity for 2024.pptx
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
UI5con 2024 - Bring Your Own Design System
UI5con 2024 - Bring Your Own Design SystemUI5con 2024 - Bring Your Own Design System
UI5con 2024 - Bring Your Own Design System
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
 
zOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL DifferenceszOS Mainframe JES2-JES3 JCL-JECL Differences
zOS Mainframe JES2-JES3 JCL-JECL Differences
 
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
Everything You Need to Know About X-Sign: The eSign Functionality of XfilesPr...
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
 

QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"