Selenium提供了一个强大的用于真实的模拟用户交互的一个类----Actions,这个类提共了一系列的API供模拟交互:
keyDown : 用于模拟按键被按下
keyUp : 用于模拟按键松开
doubleClick : 用于模拟双击
clickAndHold : 用于模拟鼠标左键点住不放开
release : 用于模拟松开鼠标,与clickAndHold相配合
moveToElement : 将鼠标
移动至元素的中间位置
contextClick : 模拟鼠标右键点击
dragAndDrop : 拖拽
这里由于测试页面的限制我就只举一个contextClick的例子: package org.coderinfo.demo; 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; public class ActionDemo { private static final String URL = "http://www.baidu.com"; /** * @author Coderinfo * @E-mail coderinfo@163.com */ public static void main(String[] args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); //最大化浏览器界面 driver.get(URL); //访问度娘首页。 Thread.sleep(2000); //等待页面加载 WebElement input = driver.findElement(By.id("kw")); //获取 百度搜索框 Actions ac = new Actions(driver); // 为driver 加载 actions ac.contextClick(input).perform(); // 在百度搜索框上点击右键 Thread.sleep(10000); driver.quit(); } } |
相关
文章:
对于上传文件的用例,首先需要找到上传文件的对象,然后直接往这个对象sendKeys,传入需要上传文件的正确路径,绝对路径和相对路径都可以的,但是上传的文件必须存在,否则会报错。下面直接看例子吧:
package org.coderinfo.demo; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; /** * @author Coderinfo * @Email: coderinfo@163.com */ public class UpdateFile { private static final String URL = "file:///C:/Documents and Settings/user/Desktop/Selenium/update_file.html"; public static void main(String[] args) { WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(URL); // Use API:sendKeys to update file driver.findElement(By.id("update")).sendKeys("C:/Documents and Settings/user/Desktop/Selenium/update_file.html"); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } driver.close(); } } |
<!DOCTYPE html> <html> <head> <title>Update File</title> <style> h2 { text-align : center } </style> </head> <body> <h2>Update File Demo</h2> <form> Update File:<input type="file" id="update"/> </form> </body> </html> |
相关
文章:
一般的简单Java应用就不多说了,一些框架会提供针对junit的扩展,使得测试变得更容易,例如Spring官方就提供了spring-test,用于提供获取ApplicationContext等方面的支持。
首先要做的是,改变JUnit的实际执行类,将默认的执行类Suite替换为Spring提供的SpringJUnit4ClassRunner,也就是在测试类前面加上一个注解:
@RunWith(SpringJUnit4ClassRunner.class)
然后,我们需要告诉这个测试类Spring配置文件的位置:
@ContextConfiguration(locations={"classpath:applicationContext.xml",
"classpath:applicationContext-security.xml","file:src/main/webapp/WEB-INF/servlet.xml"})
笔者这里展示了两种配置文件路径的写法。前两个是spring常见的配置文件,放在classpath根目录下,而“file”开头的路径是完全限定路径,默认是相对于实际的项目路径的,例如笔者使用Eclipse进行开发,这个路径的写法是相对于项目文件所在文件夹的根目录的。该写法适用于没有直接放在classpath下的一些
web相关的配置文件,例如本例展示的就是放在常见的WEB-INF目录下的一个文件。
基于以上描述,笔者写了一个Spring测试基类:
package com.test.basic; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={/*"file:src/main/webapp/WEB-INF/wxiot-servlet.xml",*/ "classpath:applicationContext.xml", "classpath:applicationContext-security.xml"}) public classTestBase { protected Log logger = LogFactory.getLog(TestBase.class); @Before //一些公用的“初始化”代码 public void before(){ } } |
有了这个基类,我们就可以动手写各个模块的测试类了,只要在定义测试类的时候继承TestBase,并在具体的方法前面加上@Test注解,笔者这里给出一个测试类的简单示例:
import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.reports.util.ActiveMQSender; import com.test.basic.TestBase; public classActiveMQSenderTest extends TestBase { @Autowired ActiveMQSendersender; @Test public void sendQTest(){ Assert.assertNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "20131025102122")); Assert.assertNotNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "2013-10-26 10:21:22")); } @Test public void sendTopicTest(){ Assert.assertNull(sender.sendInformationTopic("发,布。到?Topic!的”信¥息", "20131023102122","20131025102122") ); } } |
最后执行“RunAs -> JUnit Test”即可开始JUnit单元测试了,使用Maven命令还可以方便地对特定目录下(通常是src/test/java目录)的所有测试类进行批量测试。
对于Java Web项目,某些业务类可能会带有使用ServletContext等Web容器相关类的代码,对于这些类我们就不能直接用JUnit来测试了,因为默认JUnit是没有Web容器的,我们通常需要借助其它相关的辅助类或者模拟Web容器来进行测试,例如利用struts2-junit-plugin的帮助来测试struts的action,这些内容网上的资料很多,不在本文的讨论范围之内。
一些用到了web容器的业务类只需稍加修改,就可以直接用于JUnit测试。假设一个业务类使用了ServletContext来获取容器内的资源,例如一个配置文件:
InputStream is=context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
其中context变量保存了Web容器的ServletContext,如果直接使用JUnit来测试,必然导致空指针异常。此时我们可以稍作修改:
InputStream is = null; if(null != context){ is= context.getResourceAsStream("/WEB-INF/configs/command-sender.xml"); }else{//JUnit Test环境下,使用ApplicationContext获取配置文件 //NearEast 2013-10-22 try { is= SpringContextHolder.getApplicationContext(). getResource("file:src/main/webapp/WEB-INF/configs/command-sender.xml").getInputStream(); }catch(IOException e) { e.printStackTrace(); } } |
其中,SpringContextHolder是笔者在《在Java Web应用中获取Spring管理的Bean的方法》提到的一个工具类,SpringContextHolder.getApplicationContext()即获得Spring的ApplicationContext。资源的路径使用了上文提到的完全限定路径,我们也可以将其写为类似“file:E:/Workspaces/workspace_test/test/src/main/webapp/WEB-INF/configs/command-sender.xml"”的形式。经过上述修改之后,我们的业务类也可以直接利用JUnit执行测试了。
当然我们还可以用其它方式获取ApplicationContext,例如让业务类实现ApplicationContextAware接口,并使用一个变量保存ApplicationContext。
JMeter压力测试计划作成的时候,需要事先进行Scenario设计,设想我们业务应用中的几种场景。
比如,考虑以下的这几种场景。
Scenario1、多家经销商同时在做consumer的登录之后,大概20%的经销商在做整车登录,80%的经销商在做维修配件的登录。
Scenario2、多家经销商同时在月末进行盘点作业的。
Scenario3、多家经销商同时进行xxx功能的检索查询。
2、测试录制相关
使用JMeter的代理或是BadBoy进行录制的时候,特别是JMeter代理的时候,操作不能太快,不然容易造成录制失败。
录制之后,需要对录制之后的代码进行一定的处理。
比如,适当的追加断言,这样才能确认到这一步在实际运行中的正确性。
3、测试的实施过程中
有多个人在负责同一个系统的JMeter压力测试的时候,需要考虑不要互相干扰了。
因为大家使用的服务器的资源是一样的,没有分配好测试顺序的话,得出来的测试结果可能就不是我们所要的结果了。
是混杂的结果,那就没有意义了。
4、需要监控的一些数据
web服务器、ap服务器、db服务器等的CPU、内存、Full GC、硬盘使用量、translation数等。
还需要对JMeter中产生的聚合报告进行数据的分析。
1、length() 字符串的长度
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
2、charAt() 截取一个字符
例:char ch;
ch="abc".charAt(1); 返回'b'
3、getChars() 截取多个字符
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。
例:String s="this is a demo of the getChars method.";
char buf[]=new char[20];
s.getChars(10,14,buf,0);
4、getBytes()
替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。
5、toCharArray()
6、equals()和equalsIgnoreCase() 比较两个字符串
7、regionMatches()用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars)
8、startsWith()和endsWith()
startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
9、equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1="Hello";
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
10、compareTo()和compareToIgnoreCase() 比较字符串
11、indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串最后一次出现的地方。
12、substring()
它有两种形式,第一种是:String substring(int startIndex)
第二种是:String substring(int startIndex,int endIndex)
13、concat() 连接两个字符串
14 、replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下 :
String replace(char original,char replacement)
例如:String s="Hello".replace('l','w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
15、trim() 去掉起始和结尾的空格
16、valueOf() 转换为字符串
17、toLowerCase() 转换为小写
18、toUpperCase() 转换为大写
19、StringBuffer构造函数
StringBuffer定义了三个构造函数:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
StringBuffer(CharSequence chars)
(1)、length()和capacity()
一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
(2)、ensureCapacity() 设置缓冲区的大小
void ensureCapacity(int capacity)
(3)、setLength() 设置缓冲区的长度
void setLength(int len)
(4)、charAt()和setCharAt()
char charAt(int where)
void setCharAt(int where,char ch)
(5)、getChars()
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
(6)、append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
例:int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append("a=").append(a).append("!").toString();
(7)、insert() 插入字符串
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
(8)、reverse() 颠倒StringBuffer对象中的字符
StringBuffer reverse()
(9)、delete()和deleteCharAt() 删除字符
StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
(10)、replace() 替换
StringBuffer replace(int startIndex,int endIndex,String str)
(11)、substring() 截取子串
String substring(int startIndex)
String substring(int startIndex,int endIndex)
请求表操作表:用户信息表(person_tab)
种类:Before delete
功能描述:关联删除所有外键指向该表的数据行,删除与人员关连的数据行
操作表:
日历提示信息表(calendarNote_tab)
公文基础信息表(documentBaseInfo_tab)
AB角
工作分工信息表(divideWork_tab)
公文督办基础信息表(superviseBaseInfo_tab)
人员在岗信息表(guardInfo_tab)
周工作计划信息表(planOfWeek_tab)
/***************************************************/ create or replace TRIGGER DelPerson BEFORE DELETE ON person_tab FOR EACH ROW BEGIN delete from calendarNote_tab where calendarNote_tab.c_userId =:old.p_userId; delete from documentBaseInfo_tab where documentBaseInfo_tab.dbi_publishUserId =:old.p_userId; delete from superviseBaseInfo_tab where superviseBaseInfo_tab.sbi_enterUserId =:old.p_userId; delete from divideWork_tab where divideWork_tab.dw_enterUserId=:old.p_userId; delete from guardInfo_tab where guardInfo_tab.gi_userId=:old.p_userId; delete from planOfWeek_tab where planOfWeek_tab.pw_userId=:old.p_userId; END; |
请求表操作表:组织结构信息表(department_tab)
种类: Before delete
功能描述:关联删除所有外键指向该表的数据行,删除与部门有关的数据行
操作表:用户信息表(person_tab)
/***************************************************/ create or replace TRIGGER Deldepartment BEFORE DELETE ON DEPARTMENT_TAB FOR EACH ROW BEGIN delete from person_tab where person_tab.p_departmentId =:old.dm_id; END; |
在本章中,我们将
学习如何创建一个
测试计划,测试一个WebService。对于我们的测试目的,我们已经创建了一个简单的 Web 服务项目,并将其部署在 Tomcat 服务器上本地。
创建WebService项目
要创建一个 Web 服务项目中,我们使用了Eclipse IDE。首先编写服务端接口 HelloWorld 包下com.yiibai.ws。 HelloWorld.java 的内容如下:
package com.yiibai.ws; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; //Service Endpoint Interface @WebService @SOAPBinding(style = Style.RPC) public interface HelloWorld{ @WebMethod String getHelloWorldMessage(String string); } |
这个服务有一个的方法 getHelloWorldMessage 需要字符串 参数。
下一步创建实现类 HelloWorldImpl.java 在包 com.yiibai.ws 下。
package com.yiibai.ws; import javax.jws.WebService; @WebService(endpointInterface="com.yiibai.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld { @Override public String getHelloWorldMessage(String myName){ return("Hello "+myName+" to JAX WS world"); } } |
作为下一个步骤,让本地发布此Web服务通过创建端点出版商和公开此服务的服务器上。
publish方法有两个参数:
端点URL字符串。
实现程序对象 HelloWorld 实现类,在这种情况下,这是作为一个Web服务公开在以上参数中提到的由URL标识的端点。
HelloWorldPublisher.java 内容如下所示:
package com.yiibai.endpoint; import javax.xml.ws.Endpoint; import com.yiibai.ws.HelloWorldImpl; public class HelloWorldPublisher { public static void main(String[] args){ Endpoint.publish("http://localhost:9000/ws/hello", new HelloWorldImpl()); } } |
接下来修改web.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> <web-app> <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <servlet-name>hello</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <session-config> <session-timeout>120</session-timeout> </session-config> </web-app> |
要部署的 web 服务应用程序,我们需要 sun-jaxws.xml 配置文件,这个文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="HelloWorld" implementation="com.yiibai.ws.HelloWorldImpl" url-pattern="/hello"/> </endpoints> |
现在,所有文件都准备好目录结构看起来会像下面的图片:
现在,这个应用程序创建一个WAR文件。选择 project > right click > Export > WAR文件。hello.war 文件保存Tomcat 服务器 webapps文件夹下。现在启动Tomcat服务器。在服务器启动后,你应该能够访问web服务可以通过以下网址:
http://localhost:8080/hello/hello
创建JMeter测试计划
现在,让我们创建一个测试计划,测试上面的 web服务。
重命名测试计划
通过点击启动JMeter的窗口 /home/manisha/apache-jmeter-2.9/bin/jmeter.sh. 点击测试计划节点上。重命名此测试计划节点 WebserviceTest.
添加线程组
添加一个线程组,这是所有其他元素,如取样器,控制器,监听的占位符。右键单击我们的测试计划 WebserviceTest(our Test Plan) > Add > Threads(Users) > Thread Group。线程组将添加根据测试计划(WebserviceTest)的节点。
接下来,让我们修改线程组的默认属性,以满足我们的测试。改变以下属性:
Name: webservice user
Number of Threads (Users): 2
Ramp-Up Period: leave the the default value of 0 seconds.
Loop Count:2
添加SAMPLER-SOAP/XML RPC请求
现在,我们已经定义了用户,它是时间定义,他们将要执行的任务。我们将添加 SOAP/ XML-RPC 请求元素。点击鼠标右键得到添加菜单,然后选择 Add > Sampler > SOAP/XML-RPC Request,选择元素树中的SOAP/ XML-RPC请求,并在下面的图片编辑下列属性:
这个元素中输入下列详细信息:
Name: SOAP/XML-RPC Request URL: http://localhost:8080/hello/hello?wsdl Soap/XML-RPC Data: Enter the below contents <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://ws.yiibai.com/"> <soapenv:Header/> <soapenv:Body> <web:getHelloWorldMessage> <arg0>Manisha</arg0> </web:getHelloWorldMessage> </soapenv:Body> </soapenv:Envelope> |
添加监听器
需要添加到测试计划中的最后一个元素是一个监听器。此元素是负责所有的 HTTP 请求的结果存储在一个文件中,并呈现出可视化的数据模型。
选择 webservice 用户元素,并添加一个查看结果树监听器(Add > Listener > View Results Tree).
运行此测试计划
现在保存的以上测试计划 test_webservice.jmx。执行本测试计划使用 Run > Start 选项。
查看输出
下面的输出,可以看到在监听器中。
可以看到在过去的图像响应消息 "Hello Manisha to JAX WS world".
sqllie区别于我们以前接触的
数据库,它是通过android自带的 方法来驱动数据库的建立:
建立数据库表和操作数据库的大致过程:
1.让一个类 去继承 SqliteOpenHelper (这是一个抽象类):
重写该类的构造方法 ;实现未实现的方法,其中一个为 onCreate(SQLiteDatabase db) {} ;还有一个为 onUpgrade(SQLiteDatabase db, int arg1, int arg2);
oncreate方法是当地第一次创建表的时候调用的方法,当你想修改该数据库表的时候,我们只是需要改一下构造方法的版本这个属性,当你再次调用数据的方法时候,系统就自动调用 onUpgrade方法 在原来的表的基础上对 表进行修改,所以要是写该数据库表(这个数据库表已经建立了),我们只需要将些修改的放在此方法中即可。
2.去写具体方法的方法体:
‘当调用到 SqliteOpenHelper的 非静态方法getReadableDatabase()或者getWritableDatabase()方法是实现对数据库的建立和链接;
这两个方法功能是类似的(通过查看源代码得知),getReadableDatabase()方法其实包含了getWritableDatabase()方法,也就是说getReadableDatabase()在实现的时候 调用了getWritableDatabase()这个方法,区别在于 getWritableDatabase()在空间已经满的时候 会报异常,证明此时已经不能再往数据库的表添加东西了,所以这个方法的功能偏向“写”,也就是对数据的insert,delete,update适合用这个方法。
getReadableDatabase()在内部调用了getWritableDatabase()这个方法,但是这个方法偏向于读,而不是去操作数据库的数据,一般在读取数据库的数据是用到。
3. 实现对数据库的操作:
SQLite数据库本身就封装了 数据库的一些基本操作,也就是数据库的 CRUD;这里可以调用具体的 这些方法实现多数据库的操作,同样你也可以自己写操作数据库的方法,代码很简单,这里就不写出了啦。。大致描述下呵呵
【FAQ1:如何查看源文件?】
问题描述:如何查看源文件?
解决方案:
1. 一般情况下:在
web页面点击右键,在右键菜单中选择“查看源文件”选项。
2. 该web页面的右键功能被锁定:在浏览器的主菜单中找到“查看”,在其下拉列表中选择“查看源代码”选项;
3.该web页面采用没有主菜单的框架设计:建议使用带有“解除右键锁定”插件的浏览器,例如使用遨游浏览器(Maxthon),可以安装其鼠标解锁插件(EnableRightClick)。
【FAQ2:框架类型的web,如何获得主页面的真实URL?】
问题描述:框架类型的web,浏览器地址栏中显示的URL一般不是主页面的实际URL,如何获得主页面的真实URL?
解决方案:开启webscarab,使用代理,拦截GET和POST类型的HTTP请求,可以获得所有操作过程中涉及的URL。
【FAQ3:为什么在地址栏输入URL,有时可以正常打开页面,有时候不能?】
问题描述:为什么在地址栏输入URL,有时可以正常打开页面,有时候不能?
原因分析:这种情况并不是真正的通过URL绕过鉴权的安全漏洞。由于浏览器会自动记录会话ID(SessionID),即使关闭了访问原web的tab页,只要不关闭浏览器本身,这些会话ID依然不会清空,这时输入URL,它会继承前次会话ID。
解决方案:记录URL后,关闭浏览器重启,或使用其他浏览器,然后再在地址栏内输入URL进行访问。
【FAQ4:为什么有些输入数据,在提交时,HTTP代理(如webscarab)却拦截不到呢?】
问题描述:为什么有些输入数据,在提交时,HTTP代理(如webscarab)却拦截不到呢?
原因分析:目前有些web使用了AJAX技术,当用户在页面的一些输入域中输入数据时,AJAX会自动在后台发送这些数据。如果
测试者在填写完所有的输入域后,再配置HTTP代理,那么,在这之前通过AJAX提交的数据就拦截不到了。
解决方案:建议在填写数据前就配置webscarab代理。
【FAQ5:当产品由于特殊原因(比如客户需求、特殊的应用场景),无法满足《Web安全测试规范》的一些安全性要求时,应该怎么办?】
问题描述:当产品由于特殊原因(比如客户需求、特殊的应用场景),无法满足《Web安全测试规范》的一些安全性要求时,应该怎么办?
解决方案:请准备好相关材料和说明,联系
安全测试小组(何伟祥)讨论出具体实施方案。
【FAQ6:AppScan对登陆页面含有验证码的Web应用无法进行扫描】
问题描述:由于会话超时或主动注销,导致会话ID失效,AppScan无法再对需要登录才能访问的URL进行扫描。
解决方案:录制登录之后,在scan configuration设置中,对login management下保存的参数中的会话ID进行设置,取消掉对JSESSIONID的tracking。这样再进行扫描就不会出现会话超时了
Grinder
Grinder是一个开源的JVM负载
测试框架,它通过很多负载注射器来为分布式测试提供了便利。 支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的 主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本 化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。
Pylot
Pylot是一款开源的测试
web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视
test suites。
Web Capacity Analysis Tool (WCAT)
这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚本 HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户端又可以产生多个虚拟客户端(最大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使用 SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确的 GET 或 POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存。
fwptt
fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net, jsp, php 或是其它的Web应用。
JCrawler
JCrawler是一个开源( CPL) 的WEB应用
压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下,将自动提交Sitemap给前5名的搜索引擎!
Apache JMeter
Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以支持各种各样的测试模块。它和用于HTTP和
SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据显示,测试同步及测试的创建和执行。
Siege
Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 Siege 支持基本的认证,cookies, HTTP 和 HTTPS 协议。
http_load
http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力
测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。
Web Polygraph
Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括
微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具。
OpenSTA
OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行
性能测试。例如虚拟多个不同的用户同时登陆被测试网站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析。