how run cucumber with jenkins
Αυτό το σεμινάριο παρέχει μια πλήρη επισκόπηση του αγγουριού με τα φύλλα Jenkins και Excel για να εξηγήσει την ολοκλήρωση του αγγουριού Jenkins :
Σε αυτό το σεμινάριο, θα συζητήσουμε το Αγγούρι με το φύλλο Jenkins και το Excel. Ελπίζουμε ότι αυτό το σεμινάριο θα σας βοηθήσει.
Τι θα μάθετε:
- Αγγούρι με Τζένκινς
- Διαμόρφωση Jenkins
- Έκθεση αγγούρι Jenkins
- Αγγούρι Excel
- Παρατήρηση
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Αγγούρι με Τζένκινς
Αυτοματισμός δοκιμαστικών σεναρίων
Πρέπει να γίνει η ακόλουθη διαμόρφωση.
Αρχείο χαρακτηριστικών
Χαρακτηριστικό:
Ως χρήστης
Θέλω να μπορώ να προσθέσω νέους πελάτες στο σύστημα.
Για να μπορώ να προσθέσω λογιστικά δεδομένα για αυτόν τον πελάτη.
Ιστορικό:
Δεδομένου ότι είμαι στην αρχική σελίδα του Github.
Όταν καθορίζω το όνομα χρήστη ως 'xxxxxxxxxx' και τον κωδικό πρόσβασης ως 'xxxxxxx'.
Και κάντε κλικ στο κουμπί Είσοδος.
@Καπνός
Σενάριο: Επεξεργασία του προφίλ.
Δεδομένου κάνω κλικ στην επιλογή Προφίλ σας.
Όταν κάνω κλικ στο κουμπί επεξεργασίας προφίλ.
Και ανέβασε μια νέα εικόνα.
Τότε θα έπρεπε να βλέπω νέα εικόνα προφίλ.
@Regression @ Κάθε φορά
Σενάριο: Δημιουργήστε νέα ουσία.
Δεδομένου, κάνω κλικ στην επιλογή σας Gists.
Όταν παρέχω το όνομα αρχείου, περιγραφή.
Και κάντε κλικ στο Δημιουργία δημόσιας βασικής μεθόδου.
Τότε θα έπρεπε να βλέπω τη νέα ουσία.
Αρχείο Stepdef
πώς να διαγράψετε ένα στοιχείο από έναν πίνακα java
package com.Multi; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.runtime.ScenarioImpl; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.ScenarioOutline; import cucumber.api.DataTable; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.cli.Main; public class Step2 { static public String sb; static public String sa; static WebDriver driver = null; @Before('@Smoke,@Regression') public void beforeScenario(){ System.out.println('New scenrio begins'); } @After('@Smoke,@Regression') public void afterScenario(){ System.out.println('Scenrio ends'); } @MyAnnotation public static void myanno() { System.out.println('my annot gets executed'); } @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2){ driver.findElement(By.cssSelector('input#login_field')).sendKeys(arg1); driver.findElement(By.cssSelector('input#password')).sendKeys(arg2); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Profile option$') public void i_click_on_Your_Profile_option(){ driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id='user- links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your profile')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I click on edit profile button$') public void i_click_on_edit_profile_button(){ driver.findElement(By.xpath('//*(@id='js-pjax- container')/div/div(2)/div(1)/a')).click(); // Write code here that turns the phrase above into concrete actions } @When('^Uploaded new picture$') public void uploaded_new_picture() throws InterruptedException{ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload- container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); driver.findElement(By.id('upload-profile- picture')).sendKeys('D://cucumberFinal//multiple//Files//images.jpg'); Thread.sleep(10000); String wh = driver.getWindowHandle(); driver.switchTo().window(wh); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')); Thread.sleep(10000); actions.moveToElement(element); //Thread.sleep(10000); actions.click(); //actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//div(@class='facebox- content')/form/div(3)/button')).click(); Thread.sleep(3000); // Write code here that turns the phrase above into concrete actions } @Then('^I should be seeing new profile picture$') public void i_should_be_seeing_new_profile_picture(){ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload- container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); if(!(sb.equals(sa))) { Assert.assertTrue('File Upload successful', true); } // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Gists option$') public void i_click_on_Your_Gists_option(){ driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id='user- links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your Gists')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I provide filename, description$') public void i_provide_filename_description() throws InterruptedException { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//div(@class='edit container')/div(@id='gists')/input')).sendKeys('Gist1'); Thread.sleep(2000); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1) /div/div/div/div(5)/div/pre/span')); actions.moveToElement(element); actions.click(); actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1) /div/div/div/div(5)/div/pre/span')).sendKeys('GIST1 Description'); Thread.sleep(2000); } @When('^click on Create public gist method$') public void click_on_Create_public_gist_method() { driver.findElement(By.xpath('//*(@id='new_gist')/div(2)/div(2)/button(1)')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^i should be seeing the new gist$') public void i_should_be_seeing_the_new_gist(){ List glist = driver.findElements(By.xpath('//div(@class='container repohead-details -container')/ul(1)/li(@class='flex-auto')/div/a')); for(WebElement o:glist) { if(o.getText().equals('Gist1')) { System.out.println('Gist created successfully'); } } // Write code here that turns the phrase above into concrete actions } }
Αρχείο TestNG
Αρχείο Runner
package runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; import cucumber.api.testng.AbstractTestNGCucumberTests; import cucumber.api.SnippetType; @RunWith(Cucumber.class) @CucumberOptions( features='Features', glue='com.Multi', plugin={'html:target/cucumber-html-report', 'json:target/cucumber.json', 'pretty:target/cucumber-pretty.txt','usage:target/cucumber-usage.json', 'junit:target/cucumber-results.xml'}, dryRun = false, strict = true, tags={'@Smoke,@Regression'}, monochrome = true, snippets=SnippetType.CAMELCASE ) public class Runner extends AbstractTestNGCucumberTests{ }
Διαμόρφωση Jenkins
Πρόσβαση Διεύθυνση URL της Jenkins .
Παω σε Διαχείριση Jenkins> Διαχείριση προσθήκης .
Εγκαταστήστε τις ακόλουθες προσθήκες:
- Προσθήκη αποτελεσμάτων δοκιμής αγγουριών
- Αναφορές αγγουριών
- Προσθήκη αγγουριού perf
Βεβαιωθείτε ότι κατά την εγκατάσταση όλων των εξαρτημένων προσθηκών έχουν εγκατασταθεί επιτυχώς, διαφορετικά τα πρόσθετα αναφοράς ενδέχεται να μην λειτουργούν.
καλύτεροι δωρεάν ιστότοποι λήψης μουσικής για τηλέφωνα Android
Τώρα πλοηγηθείτε στο Διαχείριση -> Διαμόρφωση καθολικού εργαλείου.
Ορίστε το διαδρομή για JDK.
Ορίστε το μονοπάτι για Maven.
Δημιουργώ ένα Νέο αντικείμενο ως έργο Maven.
Μόλις δημιουργηθεί η εργασία, κάντε κλικ στον σύνδεσμο διαμόρφωσης που υπάρχει στον αριστερό πίνακα.
Μετακινηθείτε προς τα κάτω η σελίδα.
Ορίστε την πλήρη διαδρομή του pom.xml, στόχο ως «δοκιμή» και αποθηκεύσετε η διαμόρφωση.
Μόλις ολοκληρωθούν τα παραπάνω βήματα, κάντε κλικ στο Δημιουργήστε τώρα σύνδεσμος που υπάρχει στο αριστερό πλαίσιο του Maven Project.
Το build θα εκτελεστεί και το αντίστοιχο αρχείο testing.xml (το οποίο αναφέρεται στο pom.xml) θα εκτελεστεί.
Εδώ είναι η έξοδος που εμφανίζεται στην Κονσόλα.
Έξοδος κονσόλας
(ΠΛΗΡΟΦΟΡΙΕΣ) T E S T S
(ΠΛΗΡΟΦΟΡΙΕΣ) ——————————————————-
(INFO) Εκτέλεση TestSuite
Ένα νέο σενάριο ξεκινά
Εκκίνηση του ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) στη θύρα 27348
Επιτρέπονται μόνο τοπικές συνδέσεις.
log4j: ΠΡΟΕΙΔΟΠΟΙΗΣΗ Δεν βρέθηκαν προσθήκες για το καταγραφικό
(org.apache.http.client.protocol.RequestAddCookies).
log4j: ΠΡΟΕΙΔΟΠΟΙΗΣΗ Παρακαλούμε αρχικοποιήστε σωστά το σύστημα log4j.
log4j: WARN Δείτε http://logging.apache.org/log4j/1.2/faq.html#noconfig για περισσότερες πληροφορίες.
Νοε 25, 2017 12:56:41 μ.μ. org.openqa.selenium.remote.ProtocolHandshake createSession
ΠΛΗΡΟΦΟΡΙΕΣ: Εντοπίστηκε διάλεκτος: OSS
https://avatars3.githubusercontent.com/u/31874017?s=400&u=c41bfae0fa6b9325fb4f209885b51bd02c7d897d&v=4
https://avatars3.githubusercontent.com/u/31874017?s=400&u=c41bfae0fa6b9325fb4f209885b51bd02c7d897d&v=4
Το σενάριο τελειώνει
Ένα νέο σενάριο ξεκινά
Εκκίνηση του ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) στη θύρα 24866
Επιτρέπονται μόνο τοπικές συνδέσεις.
Νοε 25, 2017 12:57:45 μμ org.openqa.selenium.remote.ProtocolHandshake createSession
ΠΛΗΡΟΦΟΡΙΕΣ: Εντοπίστηκε διάλεκτος: OSS
Το σενάριο τελειώνει
2 σενάρια (2 πέρασαν)
14 βήματα (14 πέρασαν)
2m2.677s
πώς να εκτελέσετε ένα αρχείο .bin
(INFO) Δοκιμές που εκτελέστηκαν: 1, Αποτυχίες: 0, Σφάλματα: 0, Παράλειψη: 0, Χρόνος που πέρασε: 128.513 s - στο TestSuite
(ΠΛΗΡΟΦΟΡΙΕΣ)
(INFO) Αποτελέσματα:
(ΠΛΗΡΟΦΟΡΙΕΣ)
(INFO) Οι δοκιμές εκτελέστηκαν: 1, Αποτυχίες: 0, Σφάλματα: 0, Παράλειψη: 0
(ΠΛΗΡΟΦΟΡΙΕΣ)
(JENKINS) Καταγραφή αποτελεσμάτων δοκιμών
(ΠΛΗΡΟΦΟΡΙΕΣ) ————————————————————————
(ΠΛΗΡΟΦΟΡΙΕΣ) ΚΑΤΑΣΚΕΥΗ ΕΠΙΤΥΧΙΑΣ
(ΠΛΗΡΟΦΟΡΙΕΣ) ————————————————————————
(INFO) Συνολικός χρόνος: 02:51 λεπτό
(INFO) Ολοκληρώθηκε στις: 2017-11-25T12: 58: 45 + 05: 30
(INFO) Τελική μνήμη: 12M / 28M
(ΠΛΗΡΟΦΟΡΙΕΣ) ————————————————————————
Περιμένοντας τον Τζένκιν να ολοκληρώσει τη συλλογή δεδομένων
(JENKINS) Αρχειοθέτηση D: cucumberFinal multiple pom.xml to com / cucumber.example / 0.0.1-SNAPSHOT / cucumber.example-0.0.1-SNAPSHOT.pom
το κανάλι σταμάτησε
Ολοκληρώθηκε: ΕΠΙΤΥΧΙΑ
Έκθεση αγγούρι Jenkins
Αγγούρι Excel
Αυτοματισμός δοκιμαστικών σεναρίων
Πρέπει να γίνει η ακόλουθη διαμόρφωση.
Στρατηγική σχεδιασμού δοκιμής:
- Δημιουργήστε ένα βοηθητικό πρόγραμμα αναγνώστης excel, το οποίο έχει τη δυνατότητα να λάβει το 'όνομα στήλης' ενός φύλλου excel ως παράμετρος εισόδου και σε αντάλλαγμα, θα δώσει τη 'στήλη αξία' του φύλλου excel για αυτό το 'στήλη'
- Δημιουργήστε ένα αρχείο χαρακτηριστικών, το οποίο έχει το όνομα στήλης του φύλλου excel που καθορίζεται σε διπλά εισαγωγικά σε οποιοδήποτε από τα βήματά του.
- Τώρα δημιουργήστε ένα αντίστοιχο αρχείο Stepdef για το αρχείο δυνατοτήτων και χρησιμοποιήστε τις παραμέτρους (arg1, arg2 κλπ .. που δημιουργούνται εάν καθορίσαμε τη λέξη σε διπλό απόσπασμα πάνω από το αρχείο χαρακτηριστικών) ως είσοδος για τον αναγνώστη excel (δημιουργήθηκε στο βήμα 1).
- Τώρα έχουμε την τιμή στήλης του φύλλου excel που μπορεί να χρησιμοποιηθεί ως είσοδος στο αρχείο Stepdef.
- Εκτελέστε το αρχείο χαρακτηριστικών όπως δημιουργήθηκε στο παραπάνω βήμα.
Αρχείο χαρακτηριστικών
Χαρακτηριστικό: Τίτλος της δυνατότητάς σας
Θέλω να χρησιμοποιήσω αυτό το πρότυπο για το αρχείο δυνατοτήτων μου
Ιστορικό:
Δεδομένου ότι είμαι στο Gmail και έχω πρόσβαση στην οθόνη 'screen'.
Δεδομένου, καθορίζω το όνομα χρήστη ως «όνομα χρήστη» και τον κωδικό πρόσβασης ως «κωδικό πρόσβασης».
Δόθηκε Κάντε κλικ στο κουμπί Είσοδος.
Σενάριο: Δημιουργήστε νέο μήνυμα από τον πίνακα δεδομένων
Όταν έχω πρόσβαση στο αναδυόμενο 'αναδυόμενο παράθυρο'.
Και ορίζω ως 'Προς' και θέμα ως 'Θέμα' λεπτομέρειες και κάνω κλικ στο κουμπί υποβολής.
Τότε θα έπρεπε να βλέπω το μήνυμα επιτυχίας.
Αρχείο Excel
package com.cuexcel; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import com.google.common.collect.Maps; import gherkin.formatter.model.Row; public class Excel { private static String sheet = 'Sheet1'; private static String worksheet = 'D:\cucumberFinal\cuexcel\Files\tdata.xls'; static HashMap excelinfo = new HashMap(); public static String get(String ColName) throws IOException { FileInputStream fis; int k =0; String ColValue=null; fis = new FileInputStream(worksheet); HSSFWorkbook wb = new HSSFWorkbook(fis); HSSFSheet ws = wb.getSheet(sheet); int rows = ws.getPhysicalNumberOfRows(); HSSFRow HeaderRow = ws.getRow(0); for(Integer i=1;i Αρχείο Stepdef
package com.cuexcel; import java.io.IOException; import java.util.ArrayList; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.Scenario; import cucumber.api.java.Before; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.Scenario; import com.cuexcel.Excel; public class CExcel { static public WebDriver driver; Excel e; @Before public static void callexcel() throws IOException, InterruptedException { System.setProperty('webdriver.chrome.driver', 'Executables/chromedriver.exe'); driver= new ChromeDriver(); driver.manage().window().maximize(); driver.navigate().to('https://www.google.com/gmail/about'); } @Given('^I am on Gmail and accessing screen '((^')*)'$') public void i_am_on_Gmail_and_accessing_screen(String arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//nav/div/a(2)')).click(); //arg1=Excel.get().get(0).toString(); System.out.println(e.get(arg1) + ' - is clicked'); Thread.sleep(3000); } @Given('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2) throws Throwable { //arg1=Excel.get().get(1).toString(); //arg2=Excel.get().get(2).toString(); driver.findElement(By.xpath('//input(@type='email')')).sendKeys(e.get(arg1). toString()); driver.findElement(By.xpath('//*(@id='identifierNext')/content/span')).click(); Thread.sleep(3000); driver.findElement(By.xpath('//input(@type='password')')). sendKeys (e.get(arg2). toString()); } @When('^Click on SignIn button$') public void click_on_SignIn_button() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='passwordNext')/content/span')).click(); Thread.sleep(5000); } @When('^I am accessing the popup '((^')*)'$') public void i_am_accessing_the_popup(String arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions //arg1=Excel.get().get(3).toString(); driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); System.out.println(e.get(arg1) + '- being clicked'); } @When('^I specify to as '((^')*)' and subject as '((^')*)' details and click on submit button$') public void i_specify_to_as_and_subject_as_details_and_click_on_submit_button(String arg1, String arg2) throws Throwable { // Write code here that turns the phrase above into concrete actions String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); //arg1=Excel.get().get(4).toString(); //arg2=Excel.get().get(5).toString(); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (e.get(arg1)); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(e.get(arg2)); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } @Then('^i should be seeing the success message$') public void i_should_be_seeing_the_success_message() throws Throwable { // Write code here that turns the phrase above into concrete actions WebElement sent = driver.findElement(By.xpath('//*(@id='link_vsm')')); if(sent.isDisplayed()) { System.out.println('Message sent successfully'); } } }
Αρχείο POM
4.0.0 com cuexcel 0.0.1-SNAPSHOT jar cuexcel http://maven.apache.org UTF-8 org.seleniumhq.selenium selenium-java 3.6.0 org.seleniumhq.selenium selenium-chrome-driver 3.6.0 info.cukes cucumber-core 1.2.5 info.cukes cucumber-java 1.2.5 test info.cukes cucumber-junit 1.2.5 test junit junit 4.11 test info.cukes cucumber-testng 1.2.0 info.cukes gherkin 2.12.2 provided log4j log4j 1.2.17 org.apache.poi poi-ooxml 3.9 org.apache.poi poi 3.11-beta3 xml-apis xml-apis 2.0.2 xerces xercesImpl 2.8.0 info.cukes cucumber-jvm-deps 1.0.5 provided net.masterthought cucumber-reporting 3.11.0 org.apache.maven.plugins maven-surefire-plugin 2.18 org.apache.maven.surefire surefire-junit47 2.18
Μόλις ολοκληρωθεί η παραπάνω διαμόρφωση, απλώς εκτελέστε το αρχείο χαρακτηριστικών.
Παρατήρηση
Το αρχείο Stepdef παίρνει τα δεδομένα από το φύλλο excel και εκτελεί τα βήματα δοκιμής που αναφέρονται στο αρχείο δυνατοτήτων.
Εδώ είναι το αποτέλεσμα εκτέλεσης της δοκιμαστικής θήκης όπως αναφέρεται στην κονσόλα Eclipse.

συμπέρασμα
Το BDD είναι το μέλλον της αυτοματοποιημένης δοκιμής καθώς επιτρέπει σε όλους τους ενδιαφερόμενους να συμμετάσχουν στη δημιουργία δοκιμαστικού σεναρίου, ειδικά για να παρέχουν τις εισόδους τους μέσω του αρχείου λειτουργιών.
Το αγγούρι είναι ένα ευρέως χρησιμοποιούμενο εργαλείο BDD και έχει πολλές ενσωματώσεις και χαρακτηριστικά που δεν έχουν ακόμη εφαρμοστεί στον αυτοματοποιημένο έλεγχο. Υπάρχουν πολλές ομάδες / κοινότητες που εργάζονται ενεργά στο Αγγούρι.
Εάν είστε εξοικειωμένοι με το Αγγούρι, τότε μπορείτε να εργαστείτε σε οποιοδήποτε εργαλείο BDD που διατίθεται στην αγορά, καθώς τα περισσότερα εργαλεία λειτουργούν παρόμοια με το Αγγούρι.
Ελπίζουμε να μάθατε για το Αγγούρι με τον Jenkins μέσω αυτού του σε βάθος οδηγού.
Συνιστώμενη ανάγνωση
- Εκμάθηση Python DateTime με παραδείγματα
- Cucumber Selenium Tutorial: Αγγούρι Java Selenium WebDriver Integration
- Unix Shell Scripting Tutorial με παραδείγματα
- Selenium Find Element By Text Tutorial με παραδείγματα
- Java 'αυτό' Λέξη-κλειδί: Εκμάθηση με παραδείγματα κώδικα
- BDD και αγγούρι φροντιστήριο με παραδείγματα
- C # Εκπαιδευτικός χειρισμός εξαίρεσης με παραδείγματα κώδικα
- Έλεγχος αυτοματισμού με χρήση εργαλείου αγγουριού και σεληνίου - Σελήνιο Tutorial # 30