SlideShare a Scribd company logo
1 of 67
Develop Tools, While Testing
Saar Rachamim, Gett
About Me
Saar Rachamim
BE Developer @Gett
saarr@gett.com
About Me
Developing automation tools
Innovation
About Me
Developing automation tools
Innovation
Automate everything
def main():
time.sleep(17)
conn = telnetlib.Telnet(host=COFFEE_MACHINE_ADDR)
conn.open()
conn.expect([COFFEE_MACHINE_PROM])
conn.write(COFFEE_MACHINE_PASS)
conn.write('sys brew')
time.sleep(64)
conn.write('sys pour')
conn.close()
Automate everything
def main():
time.sleep(17)
conn = telnetlib.Telnet(host=COFFEE_MACHINE_ADDR)
conn.open()
conn.expect([COFFEE_MACHINE_PROM])
conn.write(COFFEE_MACHINE_PASS)
conn.write('sys brew')
time.sleep(64)
conn.write('sys pour')
conn.close()
Automate everything
Origin Story
Origin Story
23
22
21
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Origin Story
Design
.
.
.
Design
Demo
Gett’s Road
A product loved for its quality
Join the ride
Automation Performance Tool Origin Story
App Stability Problem
App Stability
Solutions
Solutions
Manual Automation
Solutions
Manual Automation
Third party In-house
Selected Solution:
Developing in House Tool
Developing your own tool
● Questions in mind
○ What language to choose (JavaC#...)
Developing your own tool
● Questions in mind
○ What language to choose (JavaC#...)
○ What platform - mobile, desktop or web
Developing your own tool
● Questions in mind
○ What language to choose (JavaC#...)
○ What platform - mobile, desktop or web
○ DB: Sql, NoSql
Design
Design
Design
Design
Design
The Tool Code
Test Code
public class SeleniumTest {
@Test
public void test(){
String testName = Thread.currentThread().getStackTrace()[1].getMethodName();
new ThreadExecuter(testName).execute();
new TestExecuter().execute();
}
}
Test Code
public class SeleniumTest {
@Test
public void test(){
String testName = Thread.currentThread().getStackTrace()[1].getMethodName();
new ThreadExecuter(testName).execute();
new TestExecuter().execute();
}
}
Test Code
public class SeleniumTest {
@Test
public void test(){
String testName = Thread.currentThread().getStackTrace()[1].getMethodName();
new ThreadExecuter(testName).execute();
new TestExecuter().execute();
}
}
Test Code
public class SeleniumTest {
@Test
public void test(){
String testName = Thread.currentThread().getStackTrace()[1].getMethodName();
new ThreadExecuter(testName).execute();
new TestExecuter().execute();
}
}
Test Code
public class TestExecuter {
public void execute(){
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
boolean stop = false;
while(stop){
try{
driver.get(Constants.GOOGLE);
WebElement searchField = driver.findElement(By.xpath(Constants.SEARCH_FIELD));
searchField.sendKeys(new TextGenerator().getTextToSearch());
WebElement searchButton = driver.findElement(By.xpath(Constants.SEARCH_BUTTON));
searchButton.click();
Thread.sleep(Constants.FIVE_SECONDS);
}
catch(Exception e){}
}
}
}
Test Code
public class TestExecuter {
public void execute(){
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
boolean stop = false;
while(stop){
try{
driver.get(Constants.GOOGLE);
WebElement searchField = driver.findElement(By.xpath(Constants.SEARCH_FIELD));
searchField.sendKeys(new TextGenerator().getTextToSearch());
WebElement searchButton = driver.findElement(By.xpath(Constants.SEARCH_BUTTON));
searchButton.click();
Thread.sleep(Constants.FIVE_SECONDS);
}
catch(Exception e){}
}
}
}
Process Handler Code
public String getCpuUsageByProcessName(String name) throws IOException {
String[] inputArr = {"ps", "-em", "-o", "%cpu,command"};
String retVal = executeTerminalCommands(inputArr, name);
return returnSubStringAccordingStr(retVal, " /").replace(" ", "");
}
private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException {
String line;
Process process = Runtime.getRuntime().exec(inputArr);
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains(commandPart))
{
return line;
}
}
return "-1";
}
Process Handler Code
public String getCpuUsageByProcessName(String name) throws IOException {
String[] inputArr = {"ps", "-em", "-o", "%cpu,command"};
String retVal = executeTerminalCommands(inputArr, name);
return returnSubStringAccordingStr(retVal, " /").replace(" ", "");
}
private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException {
String line;
Process process = Runtime.getRuntime().exec(inputArr);
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains(commandPart))
{
return line;
}
}
return "-1";
}
Process Handler Code
public String getCpuUsageByProcessName(String name) throws IOException {
String[] inputArr = {"ps", "-em", "-o", "%cpu,command"};
String retVal = executeTerminalCommands(inputArr, name);
return returnSubStringAccordingStr(retVal, " /").replace(" ", "");
}
private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException {
String line;
Process process = Runtime.getRuntime().exec(inputArr);
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains(commandPart))
{
return line;
}
}
return "-1";
}
Process Handler Code
public String getCpuUsageByProcessName(String name) throws IOException {
String[] inputArr = {"ps", "-em", "-o", "%cpu,command"};
String retVal = executeTerminalCommands(inputArr, name);
return returnSubStringAccordingStr(retVal, " /").replace(" ", "");
}
private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException {
String line;
Process process = Runtime.getRuntime().exec(inputArr);
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains(commandPart))
{
return line;
}
}
return "-1";
}
Requests Handler Code
ProcessHandler ph = new ProcessHandler();
RequestHandler requestHandler = new RequestHandler(Constants.FB_URL);
String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "",
"testName":"" + testName + "", "browser":"Chrome"}");
while (true) {
try {
String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME);
String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME);
requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" +
Calendar.getInstance().getTime() + ""}");
} catch (Exception e) {
System.out.println(e);
}
}
Requests Handler Code
ProcessHandler ph = new ProcessHandler();
RequestHandler requestHandler = new RequestHandler(Constants.FB_URL);
String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "",
"testName":"" + testName + "", "browser":"Chrome"}");
while (true) {
try {
String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME);
String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME);
requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" +
Calendar.getInstance().getTime() + ""}");
} catch (Exception e) {
System.out.println(e);
}
}
Requests Handler Code
ProcessHandler ph = new ProcessHandler();
RequestHandler requestHandler = new RequestHandler(Constants.FB_URL);
String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "",
"testName":"" + testName + "", "browser":"Chrome"}");
while (true) {
try {
String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME);
String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME);
requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x-
www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" +
Calendar.getInstance().getTime() + ""}");
} catch (Exception e) {
System.out.println(e);
}
}
Html Code
<div class="container">
<div class="jumbotron">
<div class="panel-heading"></div>
<div ng-controller="MyController">
<div class="text-center">
<select ng-options="testName as testName for testName in testsNames" ng-model="selectedTest"></select>
<select ng-options="testTime as testTime for testTime in testsTime" ng-model="timeSelected"></select>
<select ng-options="measurement as measurement for measurement in measurements" ng-
model="measurementSelected"></select>
<button type="button" class="btn btn-primary my-2" ng-click="createGraph(selectedTest, timeSelected,
measurementSelected)">Execute</button>
</div>
<div class="text-left" style="margin-top:30px">
Html Code
<div class="container">
<div class="jumbotron">
<div class="panel-heading"></div>
<div ng-controller="MyController">
<div class="text-center">
<select ng-options="testName as testName for testName in testsNames" ng-model="selectedTest"></select>
<select ng-options="testTime as testTime for testTime in testsTime" ng-model="timeSelected"></select>
<select ng-options="measurement as measurement for measurement in measurements" ng-
model="measurementSelected"></select>
<button type="button" class="btn btn-primary my-2" ng-click="createGraph(selectedTest, timeSelected,
measurementSelected)">Execute</button>
</div>
<div class="text-left" style="margin-top:30px">
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Angular Code
$scope.createGraph = function (selectedTest, timeSelected, measurementSelected) {
...
angular.forEach(array, function (test) {
if (test.time == timeSelected && test.testName == selectedTest) {
$scope.currentData = new Array();
for (var key in test) {
var specimentRecord = test[key];
if (specimentRecord != null && typeof specimentRecord !== "undefined") {
$scope.currentData.push(specimentRecord);
$scope.currentlabels.push(specimentRecord.time);
}
}
$scope.currentData = $filter('orderBy')($scope.currentData, "time");
$scope.data = new Array();
$scope.labels = new Array();
for (var key in $scope.currentData) {
if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined")
$scope.data.push($scope.currentData[key].cpu);
if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined")
$scope.data.push($scope.currentData[key].mem);
if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined")
$scope.labels.push($scope.currentData[key].time);
}
Demo
Code Repository
https://github.com/saarRachamim/dev/tree/master/ConferenceTests
https://github.com/saarRachamim/dev/tree/master/conference_tool
Summary
Contact Information
saarrac@gmail.com
https://www.linkedin.com/in/saar-rachamim-14055a27/
Questions?

More Related Content

What's hot

The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185Mahmoud Samir Fayed
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
Implementing Software Machines in C and Go
Implementing Software Machines in C and GoImplementing Software Machines in C and Go
Implementing Software Machines in C and GoEleanor McHugh
 
Implementing Software Machines in Go and C
Implementing Software Machines in Go and CImplementing Software Machines in Go and C
Implementing Software Machines in Go and CEleanor McHugh
 
ZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleIan Barber
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionIan Barber
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 
How to stand on the shoulders of giants
How to stand on the shoulders of giantsHow to stand on the shoulders of giants
How to stand on the shoulders of giantsIan Barber
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my dayTor Ivry
 
The Ring programming language version 1.6 book - Part 28 of 189
The Ring programming language version 1.6 book - Part 28 of 189The Ring programming language version 1.6 book - Part 28 of 189
The Ring programming language version 1.6 book - Part 28 of 189Mahmoud Samir Fayed
 
Mozilla とブラウザゲーム
Mozilla とブラウザゲームMozilla とブラウザゲーム
Mozilla とブラウザゲームNoritada Shimizu
 
The Ring programming language version 1.2 book - Part 16 of 84
The Ring programming language version 1.2 book - Part 16 of 84The Ring programming language version 1.2 book - Part 16 of 84
The Ring programming language version 1.2 book - Part 16 of 84Mahmoud Samir Fayed
 
こわくないよ❤️ Playframeworkソースコードリーディング入門
こわくないよ❤️ Playframeworkソースコードリーディング入門こわくないよ❤️ Playframeworkソースコードリーディング入門
こわくないよ❤️ Playframeworkソースコードリーディング入門tanacasino
 
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Víctor Bolinches
 
Créer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureCréer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureAmaury Bouchard
 
LvivPy4 - Threading vs asyncio
LvivPy4 - Threading vs asyncioLvivPy4 - Threading vs asyncio
LvivPy4 - Threading vs asyncioRoman Rader
 

What's hot (20)

The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185The Ring programming language version 1.5.4 book - Part 40 of 185
The Ring programming language version 1.5.4 book - Part 40 of 185
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Implementing Software Machines in C and Go
Implementing Software Machines in C and GoImplementing Software Machines in C and Go
Implementing Software Machines in C and Go
 
Implementing Software Machines in Go and C
Implementing Software Machines in Go and CImplementing Software Machines in Go and C
Implementing Software Machines in Go and C
 
ZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made Simple
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 Version
 
Introducing to Asynchronous Programming
Introducing to Asynchronous  ProgrammingIntroducing to Asynchronous  Programming
Introducing to Asynchronous Programming
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
How to stand on the shoulders of giants
How to stand on the shoulders of giantsHow to stand on the shoulders of giants
How to stand on the shoulders of giants
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
 
The Ring programming language version 1.6 book - Part 28 of 189
The Ring programming language version 1.6 book - Part 28 of 189The Ring programming language version 1.6 book - Part 28 of 189
The Ring programming language version 1.6 book - Part 28 of 189
 
Mozilla とブラウザゲーム
Mozilla とブラウザゲームMozilla とブラウザゲーム
Mozilla とブラウザゲーム
 
The Ring programming language version 1.2 book - Part 16 of 84
The Ring programming language version 1.2 book - Part 16 of 84The Ring programming language version 1.2 book - Part 16 of 84
The Ring programming language version 1.2 book - Part 16 of 84
 
こわくないよ❤️ Playframeworkソースコードリーディング入門
こわくないよ❤️ Playframeworkソースコードリーディング入門こわくないよ❤️ Playframeworkソースコードリーディング入門
こわくないよ❤️ Playframeworkソースコードリーディング入門
 
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
 
C++ L08-Classes Part1
C++ L08-Classes Part1C++ L08-Classes Part1
C++ L08-Classes Part1
 
Créer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureCréer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heure
 
Go a crash course
Go   a crash courseGo   a crash course
Go a crash course
 
Binomial heap
Binomial heapBinomial heap
Binomial heap
 
LvivPy4 - Threading vs asyncio
LvivPy4 - Threading vs asyncioLvivPy4 - Threading vs asyncio
LvivPy4 - Threading vs asyncio
 

Similar to QA Fest 2019. Saar Rachamim. Developing Tools, While Testing

Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Domenic Denicola
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeLaurence Svekis ✔
 
Containers: What are they, Really?
Containers: What are they, Really?Containers: What are they, Really?
Containers: What are they, Really?Sneha Inguva
 
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript IntroductionDmitry Sheiko
 
201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harianKhairunnisaPekanbaru
 
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...Mumbai B.Sc.IT Study
 
Network security
Network securityNetwork security
Network securitybabyangle
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaFrank Lyaruu
 
Embracing the-power-of-refactor
Embracing the-power-of-refactorEmbracing the-power-of-refactor
Embracing the-power-of-refactorXiaojun REN
 
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...InfluxData
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitVaclav Pech
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+ConFoo
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsashukiller7
 
Advanced Java - Practical File
Advanced Java - Practical FileAdvanced Java - Practical File
Advanced Java - Practical FileFahad Shaikh
 

Similar to QA Fest 2019. Saar Rachamim. Developing Tools, While Testing (20)

Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 
Containers: What are they, Really?
Containers: What are they, Really?Containers: What are they, Really?
Containers: What are they, Really?
 
java sockets
 java sockets java sockets
java sockets
 
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript Introduction
 
201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian201913001 khairunnisa progres_harian
201913001 khairunnisa progres_harian
 
Fia fabila
Fia fabilaFia fabila
Fia fabila
 
Tugas 2
Tugas 2Tugas 2
Tugas 2
 
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...
Internet Technology (Practical Questions Paper) [CBSGS - 75:25 Pattern] {Mast...
 
Network security
Network securityNetwork security
Network security
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Embracing the-power-of-refactor
Embracing the-power-of-refactorEmbracing the-power-of-refactor
Embracing the-power-of-refactor
 
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...
Extending Flux to Support Other Databases and Data Stores | Adam Anthony | In...
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruit
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
 
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbsSystem Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
System Calls.pptxnsjsnssbhsbbebdbdbshshsbshsbbs
 
Java VS Python
Java VS PythonJava VS Python
Java VS Python
 
Advanced Java - Practical File
Advanced Java - Practical FileAdvanced Java - Practical File
Advanced Java - Practical File
 

More from QAFest

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQAFest
 
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQAFest
 
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QAFest
 
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QAFest
 
QA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQAFest
 
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQAFest
 
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQAFest
 
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QAFest
 
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QAFest
 
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQAFest
 
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QAFest
 
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QAFest
 
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQAFest
 
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QAFest
 
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QAFest
 
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQAFest
 
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQAFest
 
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QAFest
 
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QAFest
 
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QAFest
 

More from QAFest (20)

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
 
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
 
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
 
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
 
QA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать больше
 
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
 
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
 
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
 
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
 
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
 
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
 
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
 
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
 
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
 
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
 
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
 
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
 
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
 
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
 
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
 

Recently uploaded

AUDIENCE THEORY -CULTIVATION THEORY - GERBNER.pptx
AUDIENCE THEORY -CULTIVATION THEORY -  GERBNER.pptxAUDIENCE THEORY -CULTIVATION THEORY -  GERBNER.pptx
AUDIENCE THEORY -CULTIVATION THEORY - GERBNER.pptxiammrhaywood
 
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdf
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdfVirtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdf
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdfErwinPantujan2
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfphamnguyenenglishnb
 
Barangay Council for the Protection of Children (BCPC) Orientation.pptx
Barangay Council for the Protection of Children (BCPC) Orientation.pptxBarangay Council for the Protection of Children (BCPC) Orientation.pptx
Barangay Council for the Protection of Children (BCPC) Orientation.pptxCarlos105
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxiammrhaywood
 
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxHumphrey A Beña
 
Transaction Management in Database Management System
Transaction Management in Database Management SystemTransaction Management in Database Management System
Transaction Management in Database Management SystemChristalin Nelson
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxAnupkumar Sharma
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONHumphrey A Beña
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Seán Kennedy
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPCeline George
 
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSGRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSJoshuaGantuangco2
 
4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptxmary850239
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designMIPLM
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Celine George
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomnelietumpap1
 

Recently uploaded (20)

YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptxYOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
YOUVE GOT EMAIL_FINALS_EL_DORADO_2024.pptx
 
AUDIENCE THEORY -CULTIVATION THEORY - GERBNER.pptx
AUDIENCE THEORY -CULTIVATION THEORY -  GERBNER.pptxAUDIENCE THEORY -CULTIVATION THEORY -  GERBNER.pptx
AUDIENCE THEORY -CULTIVATION THEORY - GERBNER.pptx
 
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdf
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdfVirtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdf
Virtual-Orientation-on-the-Administration-of-NATG12-NATG6-and-ELLNA.pdf
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
 
Barangay Council for the Protection of Children (BCPC) Orientation.pptx
Barangay Council for the Protection of Children (BCPC) Orientation.pptxBarangay Council for the Protection of Children (BCPC) Orientation.pptx
Barangay Council for the Protection of Children (BCPC) Orientation.pptx
 
Raw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptxRaw materials used in Herbal Cosmetics.pptx
Raw materials used in Herbal Cosmetics.pptx
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
 
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
 
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptxFINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
 
Transaction Management in Database Management System
Transaction Management in Database Management SystemTransaction Management in Database Management System
Transaction Management in Database Management System
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERP
 
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTSGRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
GRADE 4 - SUMMATIVE TEST QUARTER 4 ALL SUBJECTS
 
4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-design
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
 
Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choom
 

QA Fest 2019. Saar Rachamim. Developing Tools, While Testing

  • 1. Develop Tools, While Testing Saar Rachamim, Gett
  • 2. About Me Saar Rachamim BE Developer @Gett saarr@gett.com
  • 5. Automate everything def main(): time.sleep(17) conn = telnetlib.Telnet(host=COFFEE_MACHINE_ADDR) conn.open() conn.expect([COFFEE_MACHINE_PROM]) conn.write(COFFEE_MACHINE_PASS) conn.write('sys brew') time.sleep(64) conn.write('sys pour') conn.close()
  • 6. Automate everything def main(): time.sleep(17) conn = telnetlib.Telnet(host=COFFEE_MACHINE_ADDR) conn.open() conn.expect([COFFEE_MACHINE_PROM]) conn.write(COFFEE_MACHINE_PASS) conn.write('sys brew') time.sleep(64) conn.write('sys pour') conn.close()
  • 22. Demo
  • 23. Gett’s Road A product loved for its quality Join the ride
  • 31. Developing your own tool ● Questions in mind ○ What language to choose (JavaC#...)
  • 32. Developing your own tool ● Questions in mind ○ What language to choose (JavaC#...) ○ What platform - mobile, desktop or web
  • 33. Developing your own tool ● Questions in mind ○ What language to choose (JavaC#...) ○ What platform - mobile, desktop or web ○ DB: Sql, NoSql
  • 40. Test Code public class SeleniumTest { @Test public void test(){ String testName = Thread.currentThread().getStackTrace()[1].getMethodName(); new ThreadExecuter(testName).execute(); new TestExecuter().execute(); } }
  • 41. Test Code public class SeleniumTest { @Test public void test(){ String testName = Thread.currentThread().getStackTrace()[1].getMethodName(); new ThreadExecuter(testName).execute(); new TestExecuter().execute(); } }
  • 42. Test Code public class SeleniumTest { @Test public void test(){ String testName = Thread.currentThread().getStackTrace()[1].getMethodName(); new ThreadExecuter(testName).execute(); new TestExecuter().execute(); } }
  • 43. Test Code public class SeleniumTest { @Test public void test(){ String testName = Thread.currentThread().getStackTrace()[1].getMethodName(); new ThreadExecuter(testName).execute(); new TestExecuter().execute(); } }
  • 44. Test Code public class TestExecuter { public void execute(){ WebDriver driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); boolean stop = false; while(stop){ try{ driver.get(Constants.GOOGLE); WebElement searchField = driver.findElement(By.xpath(Constants.SEARCH_FIELD)); searchField.sendKeys(new TextGenerator().getTextToSearch()); WebElement searchButton = driver.findElement(By.xpath(Constants.SEARCH_BUTTON)); searchButton.click(); Thread.sleep(Constants.FIVE_SECONDS); } catch(Exception e){} } } }
  • 45. Test Code public class TestExecuter { public void execute(){ WebDriver driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); boolean stop = false; while(stop){ try{ driver.get(Constants.GOOGLE); WebElement searchField = driver.findElement(By.xpath(Constants.SEARCH_FIELD)); searchField.sendKeys(new TextGenerator().getTextToSearch()); WebElement searchButton = driver.findElement(By.xpath(Constants.SEARCH_BUTTON)); searchButton.click(); Thread.sleep(Constants.FIVE_SECONDS); } catch(Exception e){} } } }
  • 46. Process Handler Code public String getCpuUsageByProcessName(String name) throws IOException { String[] inputArr = {"ps", "-em", "-o", "%cpu,command"}; String retVal = executeTerminalCommands(inputArr, name); return returnSubStringAccordingStr(retVal, " /").replace(" ", ""); } private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException { String line; Process process = Runtime.getRuntime().exec(inputArr); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = input.readLine()) != null) { if (line.contains(commandPart)) { return line; } } return "-1"; }
  • 47. Process Handler Code public String getCpuUsageByProcessName(String name) throws IOException { String[] inputArr = {"ps", "-em", "-o", "%cpu,command"}; String retVal = executeTerminalCommands(inputArr, name); return returnSubStringAccordingStr(retVal, " /").replace(" ", ""); } private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException { String line; Process process = Runtime.getRuntime().exec(inputArr); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = input.readLine()) != null) { if (line.contains(commandPart)) { return line; } } return "-1"; }
  • 48. Process Handler Code public String getCpuUsageByProcessName(String name) throws IOException { String[] inputArr = {"ps", "-em", "-o", "%cpu,command"}; String retVal = executeTerminalCommands(inputArr, name); return returnSubStringAccordingStr(retVal, " /").replace(" ", ""); } private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException { String line; Process process = Runtime.getRuntime().exec(inputArr); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = input.readLine()) != null) { if (line.contains(commandPart)) { return line; } } return "-1"; }
  • 49. Process Handler Code public String getCpuUsageByProcessName(String name) throws IOException { String[] inputArr = {"ps", "-em", "-o", "%cpu,command"}; String retVal = executeTerminalCommands(inputArr, name); return returnSubStringAccordingStr(retVal, " /").replace(" ", ""); } private String executeTerminalCommands(String[] inputArr, String commandPart) throws IOException { String line; Process process = Runtime.getRuntime().exec(inputArr); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = input.readLine()) != null) { if (line.contains(commandPart)) { return line; } } return "-1"; }
  • 50. Requests Handler Code ProcessHandler ph = new ProcessHandler(); RequestHandler requestHandler = new RequestHandler(Constants.FB_URL); String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "", "testName":"" + testName + "", "browser":"Chrome"}"); while (true) { try { String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME); String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME); requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" + Calendar.getInstance().getTime() + ""}"); } catch (Exception e) { System.out.println(e); } }
  • 51. Requests Handler Code ProcessHandler ph = new ProcessHandler(); RequestHandler requestHandler = new RequestHandler(Constants.FB_URL); String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "", "testName":"" + testName + "", "browser":"Chrome"}"); while (true) { try { String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME); String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME); requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" + Calendar.getInstance().getTime() + ""}"); } catch (Exception e) { System.out.println(e); } }
  • 52. Requests Handler Code ProcessHandler ph = new ProcessHandler(); RequestHandler requestHandler = new RequestHandler(Constants.FB_URL); String retKey = requestHandler.postHttp("", new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"time":"" + Calendar.getInstance().getTime() + "", "testName":"" + testName + "", "browser":"Chrome"}"); while (true) { try { String cpu = ph.getCpuUsageByProcessName(Constants.PROCESS_NAME); String mem = ph.getMemoryUsageByProcessName(Constants.PROCESS_NAME); requestHandler.postHttp(retKey, new String[]{"Content-Type", "Authorization"}, new String[]{"application/x- www-form-urlencoded", "key=" + Constants.SECRET}, "{"mem":"" + mem + "","cpu":"" + cpu + "", "time":"" + Calendar.getInstance().getTime() + ""}"); } catch (Exception e) { System.out.println(e); } }
  • 53. Html Code <div class="container"> <div class="jumbotron"> <div class="panel-heading"></div> <div ng-controller="MyController"> <div class="text-center"> <select ng-options="testName as testName for testName in testsNames" ng-model="selectedTest"></select> <select ng-options="testTime as testTime for testTime in testsTime" ng-model="timeSelected"></select> <select ng-options="measurement as measurement for measurement in measurements" ng- model="measurementSelected"></select> <button type="button" class="btn btn-primary my-2" ng-click="createGraph(selectedTest, timeSelected, measurementSelected)">Execute</button> </div> <div class="text-left" style="margin-top:30px">
  • 54. Html Code <div class="container"> <div class="jumbotron"> <div class="panel-heading"></div> <div ng-controller="MyController"> <div class="text-center"> <select ng-options="testName as testName for testName in testsNames" ng-model="selectedTest"></select> <select ng-options="testTime as testTime for testTime in testsTime" ng-model="timeSelected"></select> <select ng-options="measurement as measurement for measurement in measurements" ng- model="measurementSelected"></select> <button type="button" class="btn btn-primary my-2" ng-click="createGraph(selectedTest, timeSelected, measurementSelected)">Execute</button> </div> <div class="text-left" style="margin-top:30px">
  • 55. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 56. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 57. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 58. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 59. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 60. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 61. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 62. Angular Code $scope.createGraph = function (selectedTest, timeSelected, measurementSelected) { ... angular.forEach(array, function (test) { if (test.time == timeSelected && test.testName == selectedTest) { $scope.currentData = new Array(); for (var key in test) { var specimentRecord = test[key]; if (specimentRecord != null && typeof specimentRecord !== "undefined") { $scope.currentData.push(specimentRecord); $scope.currentlabels.push(specimentRecord.time); } } $scope.currentData = $filter('orderBy')($scope.currentData, "time"); $scope.data = new Array(); $scope.labels = new Array(); for (var key in $scope.currentData) { if (measurementSelected == "cpu" && typeof $scope.currentData[key].cpu !== "undefined") $scope.data.push($scope.currentData[key].cpu); if (measurementSelected == "memory" && typeof $scope.currentData[key].mem !== "undefined") $scope.data.push($scope.currentData[key].mem); if (typeof $scope.currentData[key].cpu !== "undefined" || typeof $scope.currentData[key].mem !== "undefined") $scope.labels.push($scope.currentData[key].time); }
  • 63. Demo

Editor's Notes

  1. Add logo of the conference and also on the last slide
  2. Add label of the development language
  3. Add label of the development language
  4. Now will see how it all comes together
  5. This is a humeristic image shows a failure of an app. There is a message of an SSL error that occured in the app, While the comment describe the shakespeare quote to be a head of his time
  6. There are third party tools such as: JMeter, WebLoad etc. Pros: Saves the time needed for development In cases that it is a paid tool, then most times it includes support. Cons: It won’t give us necessarily everything we need. Limitations support of programming languages\OS\etc.
  7. In house developed tools: Pros: Adjusted directly to the needs comes from the product. Self development. Cons: Can take a lot of men hours to develop. Maintenance time.
  8. Make the font bigger
  9. To add another slide that shows on what parts of the code we will go through
  10. Add label of the development This is the code the manages the tests layer To try to do it clearer, animations that show parts of the code and not everything in bulk to add explanation about each line that
  11. We take the test name, we will show later where it is used
  12. We have a thread that manages sending the values of the process that we measure
  13. We have another executer for the tests that test the product
  14. This is the code of the test that work on the UI, in this case we are testing over Chrome browser
  15. In the test we navigate to google site and then searching for different values over the search engine. This is just an example for a test, since we are not testing a specific product
  16. This is the code for getting the cpu from the a given process, We have a very similar code for abstracting the values of the memory of different processes
  17. We can see that we get the value using a method called executeTerminalCommands We will use the smae function for getting the memory, Since the code is used over mac os, different commands will be needed for different os
  18. Here we get the process that we want to measure
  19. And we are looking for the line that holds the value of the cpu of the specific process that we are measuring. This is the returned value for us
  20. This code actually sends the the values of the cpu and the memory that we got - to the database. The data base can be an in house database or a third party database. As before, this is part of the things we consider
  21. Cpu and memory values are obtained
  22. And then sent to the db server that handle the data and insert it to the database
  23. In the html code , we have a button that trigger a createGraph function
  24. This is an angular code with a create graph function
  25. We are searching in all the data for the data the was executed in a specific time
  26. Each specimentRecord at the test has its own key, so we are going over each key Then we are taking each speciment according to the key. we are simply taking all the values of the memory and cpu, that we sent during the test
  27. We are ordering it according to the time
  28. Then we are pusing the data cpu
  29. memory
  30. And the time is also pushed
  31. Now will see how it all comes together
  32. Split the Slide into 2 parts: contacts and links to github. To put it where it is relevant (showing the code)
  33. Split the Slide into 2 parts: contacts and links to github. To put it where it is relevant (showing the code)