Skip to main content

Configuration of Jenkins on Windows Server for Capybara and Calabash Projects

I think the most challenging part of test automation is nowadays having Continuous Integration and one step more is having Continuous Deployment. These two terms have been a buzzwords around the software community, and everyone is talking about them but there are very few companies that can apply these. The reasons behind this can be listed as:

  • Mis-understanding of agile and scrum
  • Lack of "real" test engineers and Lack of Dev-ops culture 
  • Lack of stable test environments 
  • Lack of vision in the software industry, which saving the day is more critical than saving the future
  • Out-of-budget, not investing on good people but investing in tools

  • On the other hand, there are lots of open-source tools that you can just build and configure your own CI, and maybe next step goes to continuous deployment. In this post, I want to explain how you can set up CI on a Windows server. I will use the following tools/technology and language: Ruby, Gem (many Gems), Capybara, Cucumber, Windows Server, and Jenkins. You can follow the instruction, but possibly you can still have some different warnings or errors. 

    Install Jenkins

    Download the appropriate version of Jenkins from the Jenkins home page

    Install Ruby 

    Capybara uses only Ruby so you need to install it. Go to the Ruby Installer page and download it. Double-click on the installer and Install it to your system. I suggest you install a version newer than 2, from here.

    Ruby Path

    Set the Ruby path so that CMD can run ruby.exe, bundle.exe, and other Ruby-related executables. Installation is straightforward, just follow the instruction.

    Clone Project

    Your project should be located in Windows Server so that the Jenkins executor can run it locally. You may need to install git, I will use GitLab so I have already installed it. You install it from git scmInstallation is straightforward, just follow the instruction.

    Install Bundler

    Thanks to Ruby World, it is very easy to manage dependency. 
    gem install bundler

    If you have a problem related to the recognition of Ruby or Gem, ensure that you have set the Ruby path correctly

    Install Gems

    Go to your automation project folder, there is a file called GemFiles which holds the necessary gems and versions if needed.
    bundle install

    if you have a DEVKit error:

    C:\Users\Administrator\Documents\web-automation>bundle installFetching git:// git:// git:// git:// gem metadata from version metadata from dependency metadata from dependencies....Installing rake 10.4.2Installing i18n 0.7.0 
    Gem::InstallError: The 'json' native gem requires installed build tools.
    Please update your PATH to include build tools or download the DevKitfrom '' and follow the instructionsat ''An error occurred while installing json (1.8.3), and Bundler cannot continue.Make sure that `gem install json -v '1.8.3'` succeeds before bundling.

    Download ruby DevKit from here and run the following commands in DevKit folder:
    ruby dk.rb init
    ruby dk.rb install

    Still have a problem you can run this:

    gem install json --platform=ruby --verbose

    If you have a connection problem: 

    C:\Users\Administrator\Documents\web-automation>bundle install
    Fetching git://
    fatal: unable to connect to[0:]: errno=No error 
    Retrying git clone "git://" "C:/Ruby
    f1e3ed1a1313da599bae7c0aa16b28" --bare --no-hardlinks --quiet due to e
    rror (2/4): Bundler::Source::Git::GitCommandError Git error: command `
    git clone "git://" "C:/Ruby200-x64/l
    313da599bae7c0aa16b28" --bare --no-hardlinks --quiet` in directory C:/
    Users/Administrator/Documents/web-automation has failed.
    fatal: unable to connect to[0:]: errno=No error

    Run the following command to set the direction to https: 
    git config --global url."".insteadOf git://

    Add Jobs 

    I preferred to separate my test scenarios with tags so that if I have new stories related to predefined tags I will not need to change jobs, I will just a @tag when I write the code. Also adding a @regression tag for important cases to run more frequently. Therefore my execution command like as follows: 
    cucumber features --tag @regression

    You can add it to Jenkins by:

    New Item > "Give Name" > Select "Freestyle Project" > click "OK" 
    Build > Add Build Step > Execute Windows batch command > add the following cucumber
    C:\Users\Administrator\Documents\web-automation\features --tag @regression

    Set the path again if you have a problem with finding ruby or other executives as follows: 'cucumber' is not recognized as an internal or external command, operable program, or batch file. 
    set PATH=%PATH%;C:\Ruby200-x64\bin; 
    cucumber C:\Users\Administrator\Documents\web-automation\features --tag @regression

    Check Jobs 

    8 scenarios (8 passed)
    32 steps (32 passed)
    Finished: SUCCESS

    Popular posts for software testing and automation

    Selenium Error "Element is not currently interactable and may not be manipulated"

    Selenium webdriver can drive different browsers like as Firefox, Chrome or Internet Explorer. These browsers actually cover the majority of internet users, so testing these browsers possibly covers the 90% of the internet users. However, there is no guaranty that the same automation scripts can work without a failure on these three browsers. For this reason, automation code should be error-prone for the browsers you want to cover. The following error is caught when the test script run for Chrome and Internet Explorer, but surprisingly there is no error for the Firefox. Selenium gives an error like below: Traceback (most recent call last):   File "D:\workspace\sample_project\", line 10, in <module>     m.login()   File "D:\workspace\ sample_project \", line 335, in login     driver.find_element_by_id("id_username").clear()   File "C:\Python27\lib\site-packages\selenium-2.35.0-py2.7.egg\selenium\webdriver\r

    Change Default Timeout and Wait Time of Capybara

    One of the biggest challenge for automation is handling timeout problem. Most of the time, timeout is 60 seconds but it may sometimes not enough if you have badly designed asynchronous calls or the third party ajax calls. This makes handling timeout more complex. set large enough to tolerate network related problems. For Selenium based automation frameworks, like Capybara, default Webdriver timeout is set to Net::ReadTimeout (Net::ReadTimeout) Changing ReadTimeout If you have timeout problem for Capybara, it gives an error like above. This means that the page is not fully loaded in given timeout period. Even you can see that page is loaded correctly but webdriver wait until the Ajax calls finish. class BufferedIO #:nodoc: internal use only def initialize (io) @io = io @read_timeout = 60 @continue_timeout = nil @debug_output = nil @rbuf = '' end . . . . . def rbuf_fill beg

    Create an Alias for Interactive Console Work: Selenium and Capybara

    If you are working on shell most of the time Aliases are very helpfull and time saving. For testing purposes you can use Alias for getting ready your test suites. In this post, I want to explain both running Selenium and Capybara on console and creating aliases for each.  This post is for Windows machines, if you are using Unix-like see   this post . Creating Scripts for Selenium and Capybara First of all, it is assumed that you have installed Selenium and Capybara correctly and they work on your machines. If you haven't installed, you can see my previous posts. I am using the Selenium with Python and the Capybara with Ruby. You can use several different language for Selenium but Capybara works only with Ruby.  Create scripts in a directory called scripts (in your home folder, like as  ~/scripts ) for your automation tool as following, save them as capybara.rb, :  Creating Aliases Depends on your favourite shell, you need to add the alias to .bashrc bash

    Page-Object Pattern for Selenium Test Automation with Python

    Page-object model is a pattern that you can apply it to develop efficient automation framework. With the page-model, it is possible to minimize maintenance cost. Basically page-object means that your every page is inherited from a base class which includes basic functionalities for every page. If you have some new functionalities that every page should have, you can simple add it to the base class. Base class is like the following: In this part we are creating pages which are inherited from base page. Every page has its own functionalities written as python functions. Some functions return to a new page, it means that these functions leave the current page and produce a new page. You should write as much as functions you need in the assertion part because this is the only part you can use the webdriver functions to interact with web pages . This part can be evaluate as providing data to assertion part.   The last part is related to asserting your test cases against to the

    Performance Testing on CI: Locust is running on Jenkins

    For a successful Continuous Integration pipeline, there should be jobs for testing the performance of the application. It is necessary if the application is still performing well. Generally performance testing is thought as kinds of activities performed one step before going to live. In general approach it is true but don't forget to test your application's performance as soon as there is an testable software, such as an api end point, functions, and etc. For CI it is a good approach to testing performance after functional testing and just before the deployment of next stage. In this post, I want to share some info about Jenkins and Locust. In my previous post you can find some information about Locust and Jenkins. Jenkins operates the CI environment and Locust is a tool for performance testing. To run the Locust on Jenkins you need command line arguments which control the number of clients ,   hatch rate,  running locust without web interface and there should be so