Sahi Documentation

Data Driven Suites

This section describes using Sahi's inbuilt data driven suite mechanism.

Introduction

info Sahi Pro provides support for Data Driven Suites from version v5.1 onwards. Data Driven suites (also referred to as ddcsv) can be used to
  1. run scripts, suites, test_case csv and other data driven suites files
  2. pass arguments to functions defined in Sahi scripts
  3. tag scripts/suites and run selective scripts/suites based on those tags
  4. control the execution of scripts/suites/csv depends upon other scripts/suites/csv status
File extension for Data driven suite is ".dd.csv".

Structure

ABCDEFGH
1#scripturltagsdependsprerequisitestimeout_minutesArgument1Argument2
2ScriptName.sahStartURL"tag1,tag2"Browser5Argument1_ValueArgument2_Value
3ScriptName1.sahStartURL"tag1,tag2"ScriptName.sahWindows10Argument1_ValueArgument2_Value

Structure Explained

ddcsv can be used to run the same script file with different sets of arguments. eg. invalidLogin.sah in the example above.

ABCDEFGH
1#scripturltagsdependsprerequisitestimeout_minutesusernamepasswordempIdHeader Row
2login.sahhttp://sahi.co.in/demo/training/login.htmuser,highBrowser5testsecret12345
3invalidLogin.sahhttp://sahi.co.in/demo/training/login.htmuser,mediumlogin.sahBrowser10tests123446789
4
5#scripturltagsusernamepasswordHeader Row
6invalidLogin.sahhttp://sahi.co.in/demo/training/login.htmuser,mediumaadd
7
8#scriptHeader Row
9scriptWithoutTags.sah
10
11#scripttagsdependsHeader Row
12parent.dd.csvadmin,high
13ddcsv.dd.csvuserparent.dd.csv
14suiteInsideddcsv.suiteadmin,highPREV
  1. Header Rows give Sahi an outline format about the coming rows. They start with #script. There are 4 predefined header values.

    #scriptSignifies a new header row. The value under this column header is the name of the Sahi script to be run.
    urlThe start URL for the script
    tagsSpecifies the tags applicable to this script
    dependsSpecifies the scripts/suites/csv to which this scripts/suites/csv to be depended
    prerequisitesSpecifies the prerequisites required to run the script. Start mode is considered as one of the prerequisites for all the scripts specified in a suite.
    Any other values in a Header Row are considered data variable names. Eg. username, password and empId are considered variable names.

    To explain line 2,

    2login.sahhttp://sahi.co.in/demo/training/login.htmuser,hightestsecret12345
    login.sah will be executed with start URL http://sahi.co.in/demo/training/login.htm with variables
    $username = "test";
    $password = "secret";
    $empId = "12345";
  2. For any script, if the argument name, number of arguments or the order of arguments needs to be changed, a new #script row needs to be added to specify the intended change to Sahi. This can be seen in line number 5, 8 and 11. eg. In line 3,

    ABCDEFGH
    1#scripturltagsdependsprerequisitestimeout_minutesusernamepasswordempIdHeader Row
    2login.sahhttp://sahi.co.in/demo/training/login.htmuser,highBrowser5testsecret12345
    3invalidLogin.sahhttp://sahi.co.in/demo/training/login.htmuser,mediumlogin.sahBrowser10tests123446789
    4
    5#scripturltagsusernamepasswordHeader Row
    6invalidLogin.sahhttp://sahi.co.in/demo/training/login.htmuser,mediumaadd
    invalidLogin.sah username, password and empId are needed where as empId is not passed in line 6. So we need to add line number 5 to inform Sahi regarding this change.
  3. In line 9,

    8#scriptHeader Row
    9scriptWithoutTags.sah
    we have simply passed a script file without any other information. In this case start url is the base url passed to this dd.csv file while running. The base URL is specified in testrunner.bat or drun.bat. Running dd.csv files has been covered in the next topic.
  4. Suites, test_case csv, and other data driven suites can also be invoked from dd.csv file. This is shown in above table (rows 11-14).

    11#scripttagsdependsHeader Row
    12parent.dd.csvadmin,high
    13ddcsv.dd.csvuserparent.dd.csv
    14suiteInsideddcsv.suiteadmin,highPREV
  5. tags, url, depends, prerequisites and any variables passed to a ddcsv file get cascaded to all ddcsvs and scripts inside it. For example, all scripts/ddcsvs inside parent.dd.csv will also be assigned admin and high tags
  6. depends is used to specify the name of the scripts/suites/csv to which the current script/suite/csv is depended. The current script/suite/csv will start execute only if all the depended scripts/suites/csv have executed successfully. If any of the depended scripts/suites/csv is FAILED or ABORTED or SKIPPED the current script will be moved to SKIPPED status. PREV command can be used instead of mentioning the immediate previous script/suite/csv name.

    Consider lines 12, 13 and 14, the parent.dd.csv mentioned under depends column in line 13 indicate that the ddcsv.dd.csv is depended on parent.dd.csv. So ddcsv.dd.csv will wait for the completion of parent.dd.csv and will start execution only if the status is SUCCESS. If any of the scripts inside parent.dd.csv is FAILED or ABORTED, ddcsv.dd.csv will not get executed and labeled as SKIPPED status. The PREV command in the line 14 refers to ddcsv.dd.csv if the main suite execute with no tags. If the status of ddcsv.dd.csv suite is SKIPPED, the suiteInsideddcsv.suite also will be moved to SKIPPED status. If the main suite is executed with admin or high tag, the PREV command will be referred to parent.dd.csv as the ddcsv.dd.csv will not be considered for execution due to the tags mismatch.
  7. prerequisites is used to specify the requirement of the script. In distributed playback, script will be run on that node only, which has all the specified capabilities to run the script.
    Consider lines 2, login.sah requires BROWSER mode to run the script.
    //specify multiple modes for a particular script.
    Browser,Android
    15#scripttagsprerequisitesHeader Row
    16login.sahadmin,highBrowser,Android
    //specify multiple modes with the instances for a particular script.
    //here Android mode requires 2 device instances.
    Browser,Android:2
    17#scripttagsprerequisitesHeader Row
    18login.sahadmin,highBrowser,Android:2
    //specify multiple browsers with the instances for a particular script.
    //here script requires 1 chrome instance and 2 firefox instances.
    chrome,firefox:2
    19#scripttagsprerequisitesHeader Row
    20login.sahadmin,highchrome:1,firefox:2
    //specify the node tags.
    //here script will run only on the node with "windows10" tag.
    windows10
    21#scripttagsprerequisitesHeader Row
    22login.sahadmin,highwindows10
    infoNote: one can set the node tags in sahi.node.tags in sahi.properties
  8. timeout_minutes is used to specify the maximum duration the script/suite can run. Sahi aborts the script/suite once the time is up.
    In the example, if login.sah did not finish in 5 minutes, Sahi will abort the script and mark it as ABORTED_TIMEOUT.
    infoIf 'timeout' is provided for both suite and a script, Sahi aborts script when any of the time is elapsed first
    Refer here to provide timeout for the whole suite execution.

Data Driven Suites with testcases

warning This feature was added to facilitate playback of only failed scenarios when running a failed scripts suite. The testcases column is automatically added to the failed scripts suite. It should not ideally be added or modified by testers in their original suites.
From Sahi Pro V6.2.0 onwards, along with three predefined header values (#script, url, tags) the testcases header is also recognized. Only those testcases which are specified in this column will run during playback.

For example, test.dd.csv is a data driven suite.

#scripturltagstestcases
scenario.s.csvhttp://sahitest.com/demo/authtestLoginLogout
another.s.csvhttp://sahitest.com/demo/admin

Here's how scenario.s.csv looks like.

CommentTagsTestCaseKeywordArgument1Argument2Argument3
loadSahisample_lib.sah
Simple test for adding books and verifying totalauth,bookspagecheckShoppingCartTotal[Documentation]Smoke test
logintestsecret
addBooks321
verifyTotal1650
logout
Test for login logoutauthtestLoginLogout[Documentation]Check Invalid
logintestbad password
logout
Only testLoginLogout testcase will be run when the above test.dd.csv is executed. No other scripts or scenario files or testcases will be run.

infoIn scenario file, the column is TestCase while in the data driven suite the column header is testcases
warningSpecifying testcases will cause the tags attribute to be ignored. Testcases will run even if the tags are not matched.

Running Data Driven Suites

Data Driven Suites are run the same way as normal suites. They can be run from command prompt using testrunner or drun or ant the same way as .suite files are run. The steps to run a dd.csv file are mentioned below.
  1. Open cmd prompt by clicking on the "bin" link on "Sahi Dashboard".
  2. Run the following cmd
    testrunner sahitests/ddcsv/test.dd.csv http://sahi.co.in/demo/ ie "admin||medium"
    or for distributed run:
    drun demo/ddcsv/test.dd.csv http://sahi.co.in/demo/ ie "admin||medium"


    The parameters passed in the above commands are explained below:

    sahitests/ddcsv/test.dd.csvpath and file name of Data Driven Suite
    http://sahi.co.in/demo/Start URL
    iebrowser on which the scripts will run
    "admin||medium"This specifies the tags and hence the scripts that need to be run. Here scipts on line 3,6,12,14 will run.
    Note: If the user specifies the last parameter as "admin&&medium" script files associated with BOTH the tags will run i.e. none of the scripts in the above example.
More information on suite execution via command line or through ant

Variable $isDataPassed and _isDataPassed()

Along with user defined variables, Sahi passes a variable named $isDataPassed to the script with value true if user variables are passed to script.

$isDataPassed is useful during development of scripts which take arguments. When scripts are played back from Sahi Controller, arguments can not be passed to the script file. In such cases, default values of variables can be defined as given below.

if(typeof $isDataPassed == "undefined"){
  // entered if executed from Controller
  // NOT entered if run from dd.csv
  $username = "default_name";
  $password = "default_pwd";
}

// or

if(!_isDataPassed()){
  // entered if executed from Controller
  // NOT entered if run from dd.csv
  $username = "default_name";
  $password = "default_pwd";
}
A script with the above code behaves thus:
  1. if it is run from the Controller, $isDataPassed will be undefined and _isDataPassed() will return false. So the if block will be executed and $username and $password will be assigned "default_name" and "default_pwd" respectively.
  2. if it is run from a dd.csv file, $isDataPassed and _isDataPassed() will be true. So the if block will not be executed.