Showing posts with label Tools. Show all posts
Showing posts with label Tools. Show all posts

Watir Recorder

I am required to automate a portion of a .NET application to cut down the time spent in smoke testing. I have used Selenium RC successfully on other projects that run on both Internet Explorer and Firefox. I used Selenium IDE for firefox to record user actions and Selenium RC under eclipse to tune my script and add logic, switching and DB Access blocks. And JUnit of course to create test cases.

There's a little problem: the application is a .Net back office application that is always run on Internet Explorer by internal clients. Because of that, the developer haven't ever paid attention to browser compatibility. And as a result, the application runs terribly on Firefox. And it's not possible to use Selenium IDE to record actions and then run the scripts on IE.

Theoritically, it's possible to code all your scripts by hands using Selenium and run them on IE with Selenium RC, but who has time to do that?

I've heard about Watir before, but never used it. Now i am experimenting with it and i like what i see. Watir Recorder will seamlessly save your time in recording user actions. Here's how a recorded ruby script will look like using Watir Recorder (click to enlarge):


Or you may prefer the text version:

require 'watir'
include Watir
require 'test/unit'
class TC_recorded < Test::Unit::TestCase
def test_recorded
ie = IE.new
ie.goto('http://www.google.com/webhp?sourceid=navclient&ie=UTF-8')
ie.link(:url, 'http://www.google.com/advanced_search?hl=en').click
ie.text_field(:name, 'as_q').set('testsquad test automation blog')
ie.select_list(:name, 'num').select_value('10')
ie.select_list(:name, 'num').select_value('20')
ie.select_list(:name, 'lr').select_value('lang_en')
ie.button(:value, 'Advanced Search').click
end
end


Up from this point you can copy your base script to a ruby (*.rb) file and add whatever logic, switching and DB access blocks to extend and parametrize your test. Today, Watir Recorder has been able to recognize text boxes, buttons, links and combo boxes for non .Net applications. As i said, i am still experimenting and i will post more results in the coming days.

Please share your experience! :)

Developers Compliance to Test Automation

A TestSquad reader sent me an email asking:

Is there a verification process to help validate that application developers comply to test automation requirements during their application development?
Usually we just give the requirements and expect application developers to comply but when you are doing the automation scripts already, some things are still skipped. I am looking for a process that will help them comply.
e.g. automation requirement: name tables as xxxx

I have to admit that answering such a question is not easy. How can you guarantee that development activity is compliant with a subsequent test automation? How does the developer's code affect the success of your test automation?

1 month ago, i was considering Selenium RC to automate a Java web application. Unfortunately and for a reason, automation was not introduced till a late stage in the project. So as soon as we started recording scripts, a problem emerged: the development team did not give an "id" attribute to the numerous html elements. And this forced us to use some workaround; unnecessary if if the QA automation effort was introduced from day one. This is relatively a simple scenario that could be solved using workaround, but i am sure the impact can much more severe for complex projects.

So a corollary answer for the original question is "continuous collaboration between developers and testers from day one in the SDLC" and that naturally leads us to Agility.


I like to use LinkedIn for tough questions. Here's the best answer i got from Greg Akins

I don't think there is an easy answer to this. One issue is
that there is a responsibility for the developer to not only create
features which are requested by the customer/business, but also to
ensure that the features are are created in a way that supports the
test process. It's my experience that the incentive to do the latter
is somewhat limited.

However, having spent time writing and designing Selenium and FIT
tests on smallish team, there was a long learning period associated
with getting the team to understand how the application needed to be
designed to support testing. I'd definitely suggest working side by
side with your developers, and iterating frequently while you're still
expecting frequent "failures" in the dev/test process

I would love to her your personal experience :)

IBM Rational Robot vs. HP (Mercury) QuickTest Professional

IBM Rational Robot

  • Smart object recognition
  • Stable recording and playback. Robot solves the problem of custom objects encountered in AppWorks by the ability to add those object to a class map.
  • IBM Rational TestManager is necessary to view detailed tests logs.
  • Datapools supported
  • Support distributed testing and sharing test scripts.
  • Very simplified scripting using SQABasic; a simplified scripting language. Other scripting languages are possible (C++ and Java) with an aid from TestManager
  • IBM Rational Robot Authorized User License + SW Subscription & Support 12 Months (D53NDLL) $ 4,676.00
  • IBM Rational Robot Floating User License + SW Subscription & Support 12 Months (D52ZFLL) $ 9,009.00
HP (Mercury) QuickTest Professional
  • Smart object recognition.
  • Stable recording and playback
  • Detailed reporting
  • VB scripting
  • Scripts can be shared, but HP (Mercury) Quality Center is necessary.
  • Datapools supported\HP (Mercury) Quality Center is necessary to share scripts.
  • Pricing: Information Not available. I will update it soon!

Enhance IBM Rational Functional Tester (RFT) with U.I Java Classes

Disclaimer: This post is related to IBM Rational Functional Tester With Java. It needs some slight modifications to work with other tools.

Sometimes, your automated test script needs to do some strange stuff. Like accessing the database, extracting some value and using this value in subsequent U.I steps in your script.

Suppose that you have hundreds of scripts that needs the following block to access the DB and read a certain value:

try{
Connection db_connection = DriverManager.getConnection("jdbc:odbc:DBNAME",
"username","password");


Statement stm2 = db_connection.createStatement();
stm2.executeQuery("select * from TableName");

}
catch( SQLException x ){

JOptionPane.showMessageDialog(null,
x.getLocalizedMessage().toString(),"Error",
JOptionPane.ERROR_MESSAGE);

}
What if the username and password is changed after a period of time for a certain reason. This means that you need to modify all your scripts and change the credentials. And this could be a pain and very time consuming.

A good practice is creating a class that will prompt the user to enter the credentials and validates them before running the script. This will save time and headache in subsequent releases.

The following is the code for the class with the proprietary information removed:


import javax.swing.JOptionPane;
import resources.SendValidUNandPWHelper;

import com.rational.test.ft.*;
import com.rational.test.ft.object.interfaces.*;
import com.rational.test.ft.object.interfaces.siebel.*;
import com.rational.test.ft.script.*;
import com.rational.test.ft.value.*;
import com.rational.test.ft.vp.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
* Description : Functional Test Script
* @author Ashehadeh
*/
class SendValidUNandPW extends SendValidUNandPWHelper
{
/**
* Script Name : CheckDBDialog
* Generated : Feb 19, 2008 8:31:06 AM
* Description : Functional Test Script
* Original Host : WinNT Version 5.1 Build 2600 (S)
*
* @since 2008/02/19
* @author Ashehadeh
*/
/**
* @param args
*/





public String[] sendValidCredentials(){

String[] result=null;
String[] k =validateInput();

while (k==null){
k= validateInput();
}

return k;


}


//check if the provided credential can access the DB
public static String[] validateInput(){

String[] result=null;
String[] k =isDBonline();

if (k==null){
result =null;
System.exit(0);

}

else {


try{
Connection db_connection = DriverManager.getConnection("jdbc:odbc:DBNAME",k[0],k[1]);

Statement stm2 = db_connection.createStatement();
stm2.executeQuery("select * from TABLEName");
result =k;

}
catch( SQLException x ){

JOptionPane.showMessageDialog(null,
"Please Enter correct Uasername/Password!","Error",
JOptionPane.ERROR_MESSAGE);
/* JOptionPane.showMessageDialog(null,
x.getLocalizedMessage().toString(),"Error",
JOptionPane.ERROR_MESSAGE);*/

result=null;

}

}
return result;
}


//check if the db is online from the first place

public static String[] isDBonline(){


String[] result=null;
String[] k =isOneEmpty();


if (k==null){
result =null;
System.exit(0);


}


//now check for DB connectivity
else {

try{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

result =k;

}



catch(ClassNotFoundException c){
JOptionPane.showMessageDialog(null,
"DB Unavailable!","Error",
JOptionPane.ERROR_MESSAGE);
result=null;
System.exit(0);

}

}
return result;
}


//is one of the fields empty? if so, exit
public static String[] isOneEmpty(){

String[] k=showDialog();
String[] result;

// if one of the username or passwords are empty, exit.
if (k[0]==null || k[1].equals("") ||
k[1].equals("") || k[1]==null){

JOptionPane.showMessageDialog(null,
"Error. Fill the two fields. Click ok to exit!","Error",
JOptionPane.ERROR_MESSAGE);

result=null;
System.exit(0);

}


//if both of them are not empty continue
else{
result=k;

}

return result;

}

//prompt the user for username and password
public static String[] showDialog() {

String DBUsername=JOptionPane.showInputDialog(null,
"Enter DB username:", "Input", JOptionPane.QUESTION_MESSAGE);
String DBpassword=JOptionPane.showInputDialog(null,
"Enter DB password:", "Input", JOptionPane.QUESTION_MESSAGE);
String[] UPArray={DBUsername,DBpassword};
return UPArray;

}



}

.Net 2008 System Tester Edition

I am in the process of evaluating .net 2008 Tester Edition. my evaluation revolves around automation. I will post results soon.

A regular expression to verify the date format mm/dd/yy

([1-9]|1[012])/([1-9]|[12][0-9]|3[01])/0[0-9]$

This will verify if the date is mM/dd/yy, where m is optional. Example: 9/21/07 or 11/21/07

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d

This will verify if the date is mm/dd/yyyy. Example: 12/12/2007

getProperty and getPropertyFromMap methods in RFT

I have encountered a problem while using RFT. I needed the script to capture a value of an object and stores it in a string. It turned out that getPropertyFromMap and getProperty work not exactly the same.

getProperty will capture the most recent property value of the specified object. While
getPropertyFromMap will capture the property value at the time the object was added to the map.

Selenium IDE (Browser Acceptance Tool)

While browsing Google London Test Automation Conference 2006 topics, a cool tool drew my attention. It's a collaborative open source project of Jason Huggins, a test engineer at Google.

The tool offers:

  • Easy record and playback
  • Intelligent field selection will use IDs, names, or XPath as needed
  • Autocomplete for all common Selenium commands
  • Walk through tests
  • Debug and set breakpoints
  • Save tests as HTML, Ruby scripts, or any other format
  • Support for Selenium user-extensions.js file
  • Option to automatically assert the title of every page

I tried the Firefox extension and it was just awesome. What i really liked the most is its light weight and its support of many scripting languages. So why don't you get your hands dirty and try it out. :)

Jason Huggins did a dedicated presentation on the tool back in 2006: