重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在eclipse中已经创建好的java的项目中,进行选中该项目之后,进行右键的方式弹出进行选择“new”选项。
创新互联公司2013年开创至今,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元红古做网站,已为上家服务,为红古各地企业和个人服务,联系电话:18982081108
这样就会弹出了下一级的菜单中,进行选择一个为other的选项。
然后就进入到了new的选项界面中,进行再列表中找到为TestNG class选项。
然后就会弹出了一个new testng class的选项,进行再package name中进行输入class文件名。
创建完成之后,进行打开文件的class的文件,可以看是java代码中就为一个测试类,一个测试类的模板。
可以通过执行testng的测试类,选中整个的项目,进行右键的方式,弹出了一个下拉中进行选择为“Run As”选中,在次选择为TestNG Test的选项。
control-1.0.1-dist.zip。 解压。
2. 用命令行来到解压的文件夹下: \selenium-remote-control-0.9.2\selenium-server-0.9.2
3. 运行: java -jar selenium-server.jar 启动selenium server (务必启动!!)
4. 在Eclipse创建一个项目,在项目的build path里面加上junit.jar和selenium-java-client-driver.jar(这个在刚解压的包里面)
5. 先利用firefox selenium IDE来录制检测页面检测功能用的junit代码。
6. 在项目里面新建一个class(junit用例):将上面的junit代码帖于此。
7. 根据eclipse的错误提示来增加相应要import的类
8. 在进行测试前,最好将对应浏览器关闭,否则容易出错。
9. 然后在Eclipse里运行 “Run As - unit Test”即可看到自动化的范例.
10.运行期间,会弹出ie窗口,自动进 行操作测试。检测完后,若junit显示为“绿色”则表示成功。
下面粘贴一下那个测试小程序
import com.thoughtworks.selenium.SeleneseTestCase;public class Untitled extends SeleneseTestCase {
public void setUp() throws Exception {
//由于selenium 对*firefox不支持3.6版本的.只能支持3.0版本.所以,最好将selenium IDE录制的代码中的firefox改为ie进行测试。
//setUp("", "*firefox");
setUp("", "*iexplore");
}
public void testUntitled() throws Exception {
selenium.open("/");
selenium.type("q", "baidu");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
selenium.click("link= 百度一下,你就知道");
//添加断言进行测试:
// assertTrue(selenium.isTextPresent("OpenQA: Selenium")); //测试出错,程序退出
assertTrue(selenium.isTextPresent("百度一 下,你就知道")); //测试成功,程序继续
}
//用于让测试的页面关闭.若不写,则页面不会关闭
public void tearDown() throws Exception {
selenium.stop();
}
}
(7)
7.1
selenium 常用操作有:open,type,click,select,selectFrame:
1. open("/")打开的是当前的网址;selenium.open("/dmmc/"):在当前的网址后面追回/dmmc/;
2. type,click,select,selectFrame各方法使用时,对元素的定位都可采用元素ID 或 xpath方式;
3. type,click,select,selectFrame去选择元素时,可以直接用元素的ID作为标 记.
4. 如:selenium.type("loginName", "coship");;采用xpath方式时,则格式如://元素名1[元素属性名1='元素属性值1']/元素名2[元素属性名2='元素 属 性值2']/....
如:selenium.type("//input[@name='admin.password']", "coship")7.2
常用命令用法:
1)
type的两种不同定位方式:
selenium.type("loginName", "coship");
//以下语句的"xpath="可以省略
selenium.type("xpath=//input[@name='admin.password']", "coship");
2)
click的两种不同定位方式:
selenium.click("imageField"); 即是通过ID定位:input type="submit" value=" " id="imageField"
selenium.click("//input[@type='submit']"); (通过属性input-type)
selenium.click("//input[@value='确定']"); (通过属性input-value)
selenium.click("//input[@name='devTypeIds' and @value='000002']") (还可通过属性@id)
3)
点击链接方式:
对于动态内容的获取,尽量避 免采用第一种方式(若内容变了,则出错),而采用第二种方式.
实现方式一:
点击链接:a href=..801830456628/a
selenium.click("link=801830456628");
实现方式二:
获取id=adminList的table中的tbody下的第三行,第二列中的a href元素。
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[2]/a");
4)
选 择下拉框:
实现方式一:
selenium.select("status", "label=启用");
即 是:select id="status"option value="1"启用/option/select
实现方式二:
selenium.select("xpath=//SELECT[@id='status']", "index=1");
具体应用,请见以下实例。7.3
实例:
用于检测abmc系统各模块功能是否正常。
方式:
用selenium IDE录制abmc系统各模块功能操作.(前提是:这些操作,这些功能都是正确成功),以后当abmc系统升级,更改后,即可运行此脚本,来检查升级是否 影响系统功能实现。若系统更改有错,则selenium中运行中某一步骤时,会出错退出。
如:
系统更改后导致某一页面打不开,这时 selenium运行到此页面时,就不能继续往下操作,就会出错而退出。注意:
1.同时,也可在测试代码中添加一些断言判断来判断成功,失败。
2.
对于firefox selenium IDE录制的脚本要进行适当的修改,尽量让selenium用元素ID来定位操作元素,而不通过元素名(元素名易变化)。
3.
若selenium RC检测代码出错,也不一定是系统升级有问题,可能是系统升级后,有些数据删除,修改了,selenium RC在回放操作时,找到原来录制时对应的数据而出错。具体代码如下:
//对于click,select,selectFrame去选择元素时,可以直接用元素的ID作为标记.// 如:selenium.click("元素ID");public class AbmcSeleniumTest extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("", "*iexplore");
}
public void testUntitled() throws Exception {
selenium.open("/abmc/");
//type的两种不同定位方式
selenium.type("loginName", "coship");
//以下语句 的"xpath="可以省略
selenium.type("xpath=//input[@name='admin.password']", "coship");
// selenium.click("imageField"); 即是通过ID 定位:input type="submit" value=" " id="imageField"
selenium.click("//input[@type='submit']");
//等待一个新的页面加载。 以毫秒为单位,超过后该命令将返回错误。
selenium.waitForPageToLoad("30000");
//即选择frame src="device/index.jsp" id="mainFrame"
selenium.selectFrame("mainFrame");
//对于动态内容的获取,尽量避免采用第一种方式 (若内容变了,则出错),而采用第二种方式
//点击链接:a href=..801830456628/a
// selenium.click("link=801830456628");
//实现方式二:获取id=adminList的table中的tbody下的第三行,第二列中的a href元素。
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[2]/a");
selenium.waitForPageToLoad("30000");
selenium.click("//input[@value=' 返回']");
selenium.waitForPageToLoad("30000");
//因为有多个“查看应用列表”,若不指定,默认获取第一个
selenium.click("link=查看应用列表");
selenium.click("btn_dsure");
// 方式一:
//selenium.click(" //a[@onclick=\"showPage('应用列表','deviceAppList.action?device.swType=2device.deviceId=0000257device.deviceName=801830456628device.specName=DevTyp',750,400)\"]");
//方式二:
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[5]/span[1]/a");
selenium.click("btn_dsure");
selenium.selectFrame("relative=up");
selenium.selectFrame("leftFrame");
selenium.click("link=应用文件管理");
selenium.click("link=应用文件信息");
selenium.selectFrame("relative=up");
selenium.selectFrame("mainFrame");
selenium.click("//a[@onclick=\"showPage('匹配终端类型','appTypeList.action?application.appId=01application.appName=maliao',750,400)\"]");
selenium.click("btn_dsure");
selenium.click("//table[@id='adminsList']/tbody/tr[7]/td[8]/span[2]/a");
selenium.waitForPageToLoad("30000");
selenium.click("//input[@name='devTypeIds' and @value='000002']");
selenium.click("//input[@value='确定']");
selenium.waitForPageToLoad("30000");
selenium.click("//a[@onclick=\"showPage('匹配终端类型','appTypeList.action?application.appId=01application.appName=maliao',750,400)\"]");
selenium.click("btn_dsure");
selenium.selectFrame("relative=up");
selenium.selectFrame("leftFrame");
selenium.click("link=终端应用管理");
selenium.click("link=终端应用许可");
selenium.selectFrame("relative=up");
selenium.selectFrame("mainFrame");
// selenium.select("status", "label=启用"); 即是:select id="status"option value="1"启 用/option/select
selenium.select("xpath=//SELECT[@id='status']", "index=1");
selenium.click("//input[@type='image']");
selenium.waitForPageToLoad("30000");
selenium.click("//input[@type='image']");
selenium.waitForPageToLoad("30000");
selenium.selectFrame("relative=up");
//即 选择frame src="device/index.jsp" id="mainFrame"
selenium.selectFrame("topFrame");
selenium.click("link=注销");
//若要测试其 它的网页,可以继续selenium.open(..)
}
}
#web测试技术
java中Junit应用介绍:assertexp1;//exp1为boolean类型的值assertexp1:message;//message为如果exp1不是true的时候,要提示的错误消息断言一般作用:代码运行前写断言判断必须满足的条件;代码运行后判断必须符合的标准;确定代码运行过程中有无改变某些不应该变的东西2.junit中的Assert类提供了很多方法,替代断言,参照api:assertEquals、assertFalse、assertTrue、assertNotNull、assertNull、assertSame、fail3.注解@interface用来定义注解@Retention用来声明注解的保留策略,有CLASS(注解保存在class文件中)、RUNTIME(运行时可用)和SOURCE(仅在源代码中)这三种@Target用来声明注解可以被添加在哪些类型的元素上:注解、类、方法、方法参数、构造、字段、方法中的普通变量定义一个能在方法上使用的注解:@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public@interfaceKennethTest{}写一个测试类publicclassTest{@KennethTestpublicvoidtest1(){System.out.println("test1");}publicvoidtest2(){System.out.println("test2");}@KennethTestpublicvoidtest3(){System.out.println("test3");}}执行一个类中所有标记KennethTest的方法publicclassMain{publicstaticvoidmain(String[]args)throwsException{//反射ClassclassObj=Test.class;//获取Test的类对象Objectobj=classObj.newInstance();//调用无参数构造,新建一个Test的对象Method[]methods=classObj.getMethods();//获取Test类中所有public方法for(Methodmethod:methods){if(method.getAnnotation(KennethTest.class)!=null){//看这个方法是否有KennethTest注解method.invoke(obj);//如果这个方法有KennethTest注解,那么这个方法被调用执行}}}}4.junit中的注解@Test@Test(expected=IndexOutOfBoundsException.class)测试方法抛出这个异常就能通过测试@Test(timeout=10)测试方法不能超过10毫秒@Ignore忽略测试@Before每个测试方法之前执行@After每个测试方法之后执行@BeforeClass在加载类时执行@AfterClass在所有测试方法执行结束,如果有after的话,所有after也执行结束后执行5.通常写测试代码的规则:1)产品源代码和测试源代码要分开,包名类名一致例如org.ken.PersonDao对应测试代码可以为test.org.ken.PersonDaoTest2)一个有功能类要写至少一个测试类3)一个方法代表一个用例用例之间要保持独立(最好不要互相调用)
测试用例设计和执行是测试工作的核心,也是工作量最大的任务之一。
测试用例(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。
测试用例编写准备
1
从配置管理员处申请软件配置:《需求规格说明书》和《设计说明书》;
2
根据需求规格说明书和设计说明书,详细理解用户的真正需求,并且对软件所实现的功能已经准确理解,然后着手制订测试用例。
测试用例制定的原则
1测试用例要包括欲测试的功能、应输入的数据和预期的输出结果。
2测试数据应该选用少量、高效的测试数据进行尽可能完备的测试。
用例覆盖
1正确性测试:输入用户实际数据以验证系统是满足需求规格说明书的要求;测试用 例中的测试点应首先保证要至少覆盖需求规格说明书中的各项功能,并且正常。
2容错性(健壮性)测试:程序能够接收正确数据输入并且产生正确(预期)的输出, 输入非法数据(非法类型、不符合要求的数据、溢出数据等),程序应能给出提示 并进行相应处理。把自己想象成一名对产品操作一点也不懂的客户,在进行任意操作。
3完整(安全)性测试:对未经授权的人使用软件系统或数据的企图,系统能够控制的程度,程序的数据处理能够保持外部信息(数据库或文件)的完整。
4接口间测试:测试各个模块相互间的协调和通信情况,数据输入输出的一致性和正确性。
5压力测试:输入10条记录运行各个功能,输入30条记录运行,输入50条记录进行测试。
6性能:完成预定的功能,系统的运行时间(主要是针对数据库而言)。
7可理解(操作)性:理解和使用该系统的难易程度(界面友好性)。
8可移植性:在不同操作系统及硬件配置情况下的运行性。
测试方法
1边界值分析法:确定边界情况(刚好等于、稍小于和稍大于和刚刚大于等价类边界值),针对我们的系统在测试过程中主要输入一些合法数据/非法数据,主要在边界值附近选取。
2等价划分:将所有可能的输入数据(有效的和无效的)划分成若干个等价类。
3错误推测:主要是根据测试经验和直觉,参照以往的软件系统出现错误之处。
测试用例的填写
1一个软件系统或项目共用一套完整的测试用例,整个系统测试过程测试完毕,将实际测试结果填写到测试用例中,操作步骤应尽可能的详细,测试结论是指最终的测试结果(结论为:通过或不通过)。
NewPhone类
package com.baidu.question;
public class NewPhone extends Phone {
private boolean mute = true;
@Override
public void call() {
if(mute){
super.call();
}else{
System.out.println("语音已关闭");
}
}
//这里是直接设置
public void setMute(boolean mute){
this.mute=mute;
}
//担心你的题目是要求两种方法,写的第二种,下面两个方法负责开关
public void openMute(){
this.mute=true;
/*
* 也可以这样写
* setMute(true);
* 下边的方法一样
* */
}
public void closeMute(){
this.mute = false;
}
}
Phone类
package com.baidu.question;
public class Phone {
public void call(){
System.out.println("打电话");
}
}
测试类
package com.baidu.question;
public class PhoneTest {
public static void main(String[] args) {
Phone phone = new Phone();
phone.call();
NewPhone newPhone = new NewPhone();
newPhone.call();
newPhone.setMute(false);
newPhone.call();
newPhone.openMute();
newPhone.call();
newPhone.closeMute();
newPhone.call();
}
}
测试结果
打电话
打电话
语音已关闭
打电话
语音已关闭