QuickTest Professional

By W.ZH

i am just doc this tool here as it might be used any project for UI testing. Beside the Selenium, this is a web UI automation testing tools developed by HP but widely used in the Oracle ADF project testing.

Because it can support the add-in extension, it supplies a lot ability to test the advance web UI by JAVA and .NET. And test script can make you do the function and regression test.

http://en.wikipedia.org/wiki/HP_QuickTest_Professional#Extensibility

 

 

 

SmartCVS

By W.ZH, Aug 2011

http://www.syntevo.com/smartcvs/index.html

SmartCVS is the best CVS Client I have ever used, Comparing with others like WinCVS, TortoiseCVS, I have used for long time, SmartCVS has a lot improves:

1. It can crosss the OS, I am using linux version and it is quick fast, and easy to use .

2. It can list all the folder/projects in your CVS root, so you know what folders in remote site easily.

3. It can sort to show what the new file, what is the non-CVS files, so you can easily check what should be check in or commit , far better than wincvs.

4. It automatically creates folders for you for new added files, you do not need to manully add your new folders like in wincvs.

5. It automatically chooses txt or bin for your file, more intellegient.

java.lang.NoClassDefFoundError: org/apache/cactus/ServletTestCase

By W.ZH Dec 28 2010

 

Issue:

When I try to run my test case through servlet of ServletTestRunner from the cactus’s war file. i face this exception:

java.lang.NoClassDefFoundError: org/apache/cactus/ServletTestCase

Reason:

In fact it is very hard to find the reason fro this kind of things. We should explain how this cactus runs by class loader, then you can know what may cause this:

WEB-INF/classes CL --> WEB-INF/lib CL --> system CL

You see, the cactus WEB-INF/classes in fact should contain your test cases classes, those u write to inherit the ServletTestCase.

and all cactus related jar should be put into the WEB-INF/lib.

to make your test cases can run,you normally also has alot other jars put into the ear file top layer, bu they are outside the WEB-INF.

So there are three place u need to check:

1. WEB-INF/classes has all the test cases class.

2. WEB-INF/lib has all the test case support jar lib files.

3. Your top layer(outside the WEB-INF), do not has any test cases class. You may need to unzip all your jars to look for them.

What error I made is N0. 3!

like this :

http://mail-archives.apache.org/mod_mbox/jakarta-cactus-user/200304.mbox/%3C3EA79AD8.2080308@gmx.de%3E

Solution:

After u find the reason, I think you know how to fix this error!

Ref:

http://mail-archives.apache.org/mod_mbox/jakarta-cactus-dev/200202.mbox/%3C002901c1bb48$0332b9e0$3b22e40c@spiritedsw.com%3E

Jdeveloper On Linux

By W.ZH

 

Here some quick tips for Jdeveloper running on linux as it might not as convienetn as the windows version, so you do not need to check the install guide pages.

1. start jdev —

      MW_HOME
/jdeveloper/jdev//bin/jdev

2. To access the quick start –

MW_HOME
/utils/quickstart/quickstart.sh

From quick start you can start jdev, can also go to config page to create/extend your jdev’s domain servers.

3. uninstall  –

      MW_HOME
/utils/uninstall/uninstall

4. page to get all the jdev extenstions by manually download.

http://www.oracle.com/technetwork/developer-tools/jdev/index-099997.html

The reason you should know this – because of sometimes you can not access the jdev update site to get all the downloads for your jdev extension.

Such as SOA editor extension or webcenter extension from oracle internall site, you can go to this page to manually download zip file and to extend your jdev.

cactus usage note

By W.ZH July 2010

Note: This in fact partly learn from my colleague usage.

0. Of coz, you need know how to write test for Junit, coz this one based on that.

1. you put your code in two commenting sentences, then when u try to create test case again, your code will not be overwritten.

 // JUnitDoclet begin method **************

your code here

// JUnitDoclet end method  ****************

 

2. if u have too many test cases to write, you can create one by one, they are not depends on each other. Because you will face compile error for test method’s return if you first create a lot test cases.

3. Some times it will create some duplicate methods for you, you just need to remove that to compile.

4. cactus has Junit 3 and 4 difference for created test case, you need to notice that.

.

Selenium Best Practice

March 25 2010

Selenium Best Pratice by Tao Zhi Yaoyao

1. Never use Selenium FIT mode

Selenium分为两种运行模式,Driven Mode(现在叫Selenium Remote Control)和FIT Mode(现在叫Selenium Core)。

FIT Mode顾名思义,就是类似FIT Testing Framework那种使用方式,主要用于QA等非技术人员编写Web应用的功能测试。FIT Mode的Selenium测试使用HTML来组织测试用例。例如我要测试一个web应用的登陆功能。我可能写出这样的HTML 表格。

 1

<
table
>


 2

<
tr
>


 3
 
<
td
>
open
</
td
>


 4
        
<
td
>
http://localhost:8080/login
</
td
>


 5
        
<
td
></
td
>


 6

</
tr
>


 7

<
tr
>


 8
 
<
td
>
type
</
td
>


 9
        
<
td
>
id=username
</
td
>


10
        
<
td
>
someuser
</
td
>


11

</
tr
>


12

<
tr
>


13
 
<
td
>
type
</
td
>


14
        
<
td
>
id=password
</
td
>


15
        
<
td
>
password
</
td
>


16

</
tr
>


17

<
tr
>


18
 
<
td
>
click
</
td
>


19
        
<
td
>
id=login_button
</
td
>


20
        
<
td
></
td
>


21

</
tr
>


22

<
tr
>


23
 
<
td
>
assertTextPresent
</
td
>


24
        
<
td
>
Welcome to xxxx
</
td
>


25
        
<
td
></
td
>


26

</
tr
>


27

</
table
>

不同于FIT,Selenium内置了一系列的命令,如上例中的open, type, click以及assertTextPresent,因此QA可以完全抛开DEV独立地编写测试(FIT需要DEV提供Behavior Fixture)。因此FIT Mode是相当容易使用的,哪怕不会使用HTML的QA,也可以使用FrontPage画出三列表格,依次填入数据。

然而对于大多数team而言——尤其是敏捷team,FIT Mode平易的外表下是令人恐惧的泥沼。大多数团队往往选择使用Selenium作为功能测试和集成测试工具而不仅仅是QA测试工具,在不同的迭代间遇到功能流程或UI变化时,必须要重构Selenium测试,或者说,Functional Test Migration。令人遗憾的是,HTML based的Selenium FIT Testing的重构竟然令人难以置信的困难。我们可以使用include等Selenium FIT扩展,使得它可以重用详细的功能(Log in, Log out诸如此类)。即便如此,在一个真实的项目中,Selenium Test的数量往往在200-500之间(我目前所处的项目在改用Driven Mode前已达350+),对于这么大基数的Selenium测试,手工重构几乎是不可想象的,而目前尚没有HTML代码重构工具。即便存在泛泛意义上的HTML重构工具,对于Selenium测试重构的有效性尚待商榷。而使用Driven Mode上述代码可以写为:

1


public
 
void
 testShouldShowAWeclomeMessageAfterUserLoggedIn() 

{
2     selenium.open( http://localhost:8080/login );
3     selenium.type( id=username , someuser );
4     selenium.type( id=password password );
5     selenium.click( id=login_button );
6     assertTrue(selenium.isTextPresent( Welcome to xxxx ));
7 }

很自然,一个训练有素的程序员会重构出如下代码:

 1


public
 
void
 login(String username, String password) 

{
 2     selenium.open( http://localhost:8080/login );
 3     selenium.type( id=username ,username);
 4     selenium.type( id=password , password);
 5     selenium.click( id=login_button );
 6 }


 7


 8

public
 
void
 testShouldShowAWeclomeMessageAfterUserLoggedIn() 

{
 9     login( someuser password );
10     assertTrue(selenium.isTextPresent( Welcome to xxxx ));
11 }

之后无论是pull up到公共基类还是extact到Utils class都是很容易的事情。由于Java在代码重构上便利,Java Selenium Remote Control成为使用Selenium的最佳方式。在这一点上,纵使Ruby语法上比Java简单灵活得多,它仍不是编写Selenium测试的最佳载体(当然一个经过精心设计的ruby selenium dsl wrapper还是具有非凡的价值的,这个我们后面会涉及到)。

2. Using the name user, system, page instead of selenium

观察上面提到的代码,其中使用selenium来操纵web应用的行为,这在Remote Control里是常见的做法,但是仍然不够好,我们可以做一些小的变化以得到更好的测试:

 1


protected
 
void
 setup() 

{
 2     selenium  =    //  intialize selenium instance
 3     user  =  selenium;
 4     currentPage  =  selenium;
 5 }


 6


 7

public
 
void
 login(String username, String password) 

{
 8     user.open( http://localhost:8080/login );
 9     user.type( id=username ,username);
10     user.type( id=password , password);
11     user.click( id=login_button );
12 }


13


14

public
 
void
 testShouldShowAWeclomeMessageAfterUserLoggedIn() 

{
15     login( some guy password );
16     assertTrue(currentPage.isTextPresent( Welcome to xxxx ));
17 }

基本上这只不过是”另一种写法”而已,但是它更好的表达了”用户的行为”,如login代码所示。以及”系统的正确相应”,即currentPage.isTextPresent()。这种是典型的对编译器无意义对人有意义的代码,也就是普遍意义上好的代码。

3. Creating a DSL base on your test codes

懂得HTML的QA可以在没有DEV的帮助下使用Selenium FIT mode,然而却不能在没有DEV的帮助下使用Driven Mode。于是最自然也是最fashion的做法,就是在已有的test codes之上提供Testing DSL或者Scripting Language,让FIT mode变得更加FIT。这方面内容是一个更大的主题,以后再详细展开吧。

4. Hacking Selenium Object to support FIT command

Selenium FIT mode和RC mode下的命令有些许差异,比如FIT中的assertTextPresent,在RC中变成了isTextPresent。同样还有FIT中最实用的命令clickAndWait,在RC中变成了click和waitForPageToLoad。在RC中使用FIT mode中的命令也非难事,找到com.thoughtworks.selenium.Selenium,添加方法:


public
 
void
 doCommand(String commmand, String parameters);

然后在com.thoughtworks.selenium.DefaultSelenium中添加实现:

1


public
 
void
 doCommand(String commmand, String parameters) 

{
2    String[] paras  =   new  String[] { “” , “” , “” }
3     for  ( int  i  =   0 ; i  <  parameters.length  &&  i  <   3 ; i ++ )
4       paras[i]  =  parameters[i];
5    commandProcessor.doCommand(command, paras);
6 }

然后试验一下:


selenium.doCommand(

clickAndWait

);

在我们使用纯RC mode之前曾经用过一段中间方案,将rc code转化为fit code来跑(因为rc不支持https),由于不是真正的rc mode,像isTextPresent之类的方法都没有办法使用,只能使用FIT mode command。因此如果因为一些特殊的原因(https, chrome起不来,hta bug多等等),你没有办法使用RC mode,但是有希望得到RC可重构的好处,那么这个tricky的技巧倒是不错的选择。

5. Using chrome and IE hta lanucher to support https
6. Run test using different browser lanucher to test browser compatibility

这两个都是和browser lanucher相关的,Selenium和JWebUnit最大的不同在于它使用真实的浏览器来跑测试,从而可以更加真实地考察系统在不同浏览器中的表现。因此使用不同的浏览器lanucher来运行测试,可以更好测试应用的浏览器兼容性,这对于web 2.0应用而言是很有帮助的。此外,使用rc提供的试验性lanucher,chrome和hta可以解决跨domain测试和https的问题。不过目前hta还是有很多bug的,推荐使用chrome。当然,最希望的还是澳洲的同事可以早日在selenium里提供https支持。

Selenium Better Practice

Selenium Better Pratice

By 桃之夭夭

Selenium 是 thoughtworks公司的一个集成测试的强大工具。最近参与了一个系统移植的项目,正好用到这个工具,

把一些使用心得分享给大家,希望大家能多多使用这样的强大的,免费的工具,来保证我们的质量。

Selenium 的文档现存的不少,不过都太简单了。使用Selenium的时候,我更多的是直接去看API文档,好在API不错,

一个一个看,就能找到所需要的 🙂   官方网站:http://www.openqa.org/selenium/

好,下面进入正题!

一、Selenium 的版本

Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。

selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE
只有 FireFox 版本。

Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。

selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,因为个人还是喜欢这种
方式 🙂

 二、一些准备工作

1、当然是下载 selenium 了,到 http://www.openqa.org/selenium/ 下载就可以了,记得选择selenium-rc 的版本。

2、学习一下 xpath 的知识。有个教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html
     一定要学习这个,不然你根本看不懂下面的内容!

3、安装 jdk1.5

 三、selenium-rc 一些使用方法

selenium-remote-control-0.9.0\server 目录里,我们运行 java -jar selenium-server.jar
之后你就会看到一些启动信息。要使用 selenium-rc ,启动这个server 是必须的。

当然,启动的时候有许多参数,这些用法可以在网站里看看教程,不过不加参数也已经足够了。

selenium server 启动完毕了,那么我们就可以开始编写测试类了!

我们先有个概念,selenium 是模仿浏览器的行为的,当你运行测试类的时候,你就会发现selenium 会打开一个

浏览器,然后浏览器执行你的操作。

 好吧,首先生成我们的测试类:

java 代码

  1. public class TestPage2 extends TestCase {   
  2.   private Selenium selenium;   
  3.   
  4.   protected void setUp() throws Exception {   
  5.      String url = “http://xxx.xxx.xxx.xxx/yyy”;   
  6.      selenium = new DefaultSelenium(“localhost”, SeleniumServer.getDefaultPort   
  7.                                 (), “*iexplore”, url);   
  8.      selenium.start();   
  9.                
  10.      super.setUp();                        
  11.            
  12.   }   
  13.   
  14.   protected void tearDown() throws Exception {   
  15.            
  16.       selenium.stop();   
  17.       super.tearDown();   
  18.                
  19.   
  20.   }   
  21.   
  22. }  

代码十分简单,作用就是初始化一个 Selenium 对象。其中:
url : 就是你要测试的网站
localhost:  可以不是localhost,但是必须是 selenium server 启动的地址
*iexplore :  可以是其它浏览器类型,可以在网站上看都支持哪些。

下面我就要讲讲怎么使用selenium 这个对象来进行测试。

1、测试文本输入框

假设页面上有一个文本输入框,我们要测试的内容是 在其中输入一些内容,然后点击一个按钮,看看页面的是否跳转
到需要的页面。

  1. public void test1() {   
  2.            
  3.     selenium.open(“http://xxx.xxx.xxx/yyy&#8221;);   
  4.            
  5.     selenium.type(“xpath=//input[@name=’userID’]”, “test-user”);   
  6.     selenium.click(“xpath=//input[@type=’button’]”);   
  7.     selenium.waitForPageToLoad(“2000”);   
  8.     assertEquals(selenium.getTitle(), “Welcome”);   
  9. }  

上面的代码是这个意思:
1、调用 selenium.open 方法,浏览器会打开相应的页面
2、使用 type 方法来给输入框输入文字
3、等待页面载入
4、看看新的页面标题是不是我们想要的。

2、测试下拉框

java 代码

  1. public void test1() {       
  2.                
  3.     selenium.open(“http://xxx.xxx.xxx/yyy&#8221;);       
  4.                
  5.     selenium.select(“xpath=//SELECT[@name=’SBBUSYO’]”, “index=1”);   
  6.     selenium.click(“xpath=//input[@type=’button’]”);       
  7.     selenium.waitForPageToLoad(“2000”);       
  8.     assertEquals(selenium.getTitle(), “Welcome”);       
  9. }     

可以看到,我们可以使用 select 方法来确定选择下拉框中的哪个选项。
select 方法还有很多用法,具体去看看文档吧。

3、测试check box

java 代码

  1. public void test1() {           
  2.                    
  3.     selenium.open(“http://xxx.xxx.xxx/yyy&#8221;);           
  4.                    
  5.     selenium.check(“xpath=//input[@name=’MEICK_000′]”);     
  6.     selenium.click(“xpath=//input[@type=’button’]”);           
  7.     selenium.waitForPageToLoad(“2000”);           
  8.     assertEquals(selenium.getTitle(), “Welcome”);           
  9. }      

我们可以使用 check 方法来确定选择哪个radio button

4、得到文本框里的文字

java 代码

  1. assertEquals(selenium.getValue(“xpath=//input[@name=’WNO’]”), “1”);  

getValue 方法就是得到文本框里的数值,可不是 getText 方法,用错了可就郁闷了。

5、判断页面是否存在一个元素

java 代码

  1. assertTrue(selenium.isElementPresent(“xpath=//input[@name=’MEICK_000′]”));  

一般这个是用来测试当删除一些数据后,页面上有些东西就不会显示的情况。

6、判断下拉框里选择了哪个选项

java 代码

  1. assertEquals(selenium.getSelectedIndex(“xpath=//SELECT[@name=’HATIMING’]”), “1”);  

这个可以用来判断下拉框显示的选项是否是期望的选项。

7、如果有 alert 弹出对话框怎么办?

这个问题弄了挺长时间,可以这样来关闭弹出的对跨框:

java 代码

  1. if(selenium.isAlertPresent()) {   
  2.   
  3.    selenium.getAlert();   
  4.   
  5. }  

其实当调用 selenium.getAlert() 时,就会关闭 alert 弹出的对话框。
也可以使用 System.out.println(selenium.getAlert()) 来查看对跨框显示的信息。

在测试的时候,有的人会显示许多alert 来查看运行时的数据,那么我们可以用下面的方式来关闭那些 alert:

java 代码

  1. while(selenium.isAlertPresent()) {       
  2.       
  3.    selenium.getAlert();       
  4.       
  5. }   

8、如何测试一些错误消息的显示?

java 代码

  1. assertTrue(selenium.getBodyText().indexOf(“错误消息”)>=0);  

切记: getBodyText 返回的时浏览器页面上的文字,不回包含html 代码的,如果要显示html 代码,用下面这个:

java 代码

  1. System.out.println(selenium.getHtmlSource());  

以上就是最常用的几个方法了,例如 click, type, getValue 等等。
还有就是一定要学习 xpath, 其实xpath 也可以有“与、或、非”的操作:

java 代码

  1. selenium.check(“xpath=//input[(@name=’KNYKBN’)and(@value=’Y’)]”);  

四、其他

selenium 还有更多的用法,例如弹出页面等等。当面对没见过的测试要求时,我最笨的方法就是按照api文档一个一个找,
好在不多,肯定能找到。

 

 

 

使用 selenium 测试文件上传的时候就不好办了,
因为安全问题,使用 javascript 是不能修改 <input type=file>
的元素的.

如果你有幸使用firefox,那么可以设置安全权限,让selenium
可以通过 type 方法来改变 <input type=file>的值.

如果你不幸使用IE,那么目前是没有办法的

我的方法就是……

在点击最后的确认按钮之前,我先

Thread.sleep(40000);

然后用一段message提示我该手动上传文件了.
然后在40秒之内,我手动选择好上传的文件,之后就是selenium
自己做了.

这样做就无法自动测试了,不过,就算是半自动化,也能满足我的
要求了

 

 

 

测试页面中的多个输入框,你还在使用这样的方式吗:

Java代码

  

selenium.type(“xpath//input[@name=’user_name’]”,   

“”);   

selenium.click(“xpath=//input[@name=’submit’]”);   

assertTrue(selenium.getBodyText().   

    indexOf(“User Name can not be blank.”)!=-1);   

selenium.type(“xpath//input[@name=’user_name’]”,   

“abc\/def”);   

selenium.click(“xpath=//input[@name=’submit’]”);   

assertTrue(selenium.getBodyText().   

    indexOf(“User Name include wrong character.”)!=-1);  

 

selenium.type(“xpath//input[@name=’user_name’]”,

“”);

selenium.click(“xpath=//input[@name=’submit’]”);

assertTrue(selenium.getBodyText().

    indexOf(“User Name can not be blank.”)!=-1);

selenium.type(“xpath//input[@name=’user_name’]”,

“abc\/def”);

selenium.click(“xpath=//input[@name=’submit’]”);

assertTrue(selenium.getBodyText().

    indexOf(“User Name include wrong character.”)!=-1);

这是一个页面上一个输入框有效性校验的测试代码。
如果只有一个 user_name 输入框,当然很简单,但是如果有20多个,甚至 30 多个,就麻烦了!

那么,你可以参考下面的方式:

Java代码

  

String checkTextVar[] = new String[]{“user_name”,   

         “user_address”, “user_info”};   

  

for(int i = 0, m = checkTextVar.length; i < m; i++) {   

  

  checkTextValidate(checkTextVar[i]);   

  

}  

 

String checkTextVar[] = new String[]{“user_name”,

         “user_address”, “user_info”};

 

for(int i = 0, m = checkTextVar.length; i < m; i++) {

 

  checkTextValidate(checkTextVar[i]);

 

}

 

其中,checkTextValidate 可以为如下方式:

Java代码

  

private void checkTextValidate(String var) {   

  

 selenium.type(“xpath//input[@name='”+var+”‘]”,   

“”);   

selenium.click(“xpath=//input[@name=’submit’]”);   

assertTrue(selenium.getBodyText().   

    indexOf(“can not be blank.”)!=-1);   

selenium.type(“xpath//input[@name='”+var+”‘]”,   

“abc\/def”);   

selenium.click(“xpath=//input[@name=’submit’]”);   

assertTrue(selenium.getBodyText().   

    indexOf(“include wrong character.”)!=-1);   

  

  

  

}  

 

private void checkTextValidate(String var) {

 

 selenium.type(“xpath//input[@name='”+var+”‘]”,

“”);

selenium.click(“xpath=//input[@name=’submit’]”);

assertTrue(selenium.getBodyText().

    indexOf(“can not be blank.”)!=-1);

selenium.type(“xpath//input[@name='”+var+”‘]”,

“abc\/def”);

selenium.click(“xpath=//input[@name=’submit’]”);

assertTrue(selenium.getBodyText().

    indexOf(“include wrong character.”)!=-1);

 

 

 

}

 

这种方式可以免去校验好多个输入框的校验,文本,数字,日期,
都可以用这种方式。