基于TDD(Test-Driven Development)的开发模式已经变的普及。这里主要介绍了js-test-driver 与IDE eclipse/myeclipse的集成与使用。
1.环境搭建
这里使用的IDE是MyEclipse10.7.1,因为在MyEclipse高一些版本中,都使用了MyEclipse Config Center,个人觉得这个比原生的eclipse要麻烦一些。
1.1打开IDE --- help ---- MyEclipse Config Center ---- software ---- add site

name: (JS-TEST-DRIVER)插件的名字
URL: http://js-test-driver.googlecode.com/svn/update

1.2选择 apply 1 change
2.配置IDE
Windows ---- preferenced ----- js Test Driver

进行设置浏览器的默认位置(如果不设置将采用系统默认的位置,如果你安装到其它目录下,将会跑出异常,故推荐安装)(我只设置了3个常用的)
3.创建项目
准备一个src 文件夹 ------ 用来存放javascript的源代码
准备一个src-test文件夹 ------ 用来存放测试用例的源代码
准备一个jsTestDriver.conf配置文件 ------ 用来进行配置jsTestDriver
server: http://serverIP:port/projectName //server: http://localhost:8080/test----设置服务器的默认地址 load: - src/*.js //在test case 运行之前被browser加载的javascript源文件 - src-test/*.js //test case 的源文件 exclude: - src/exclude.js //从不加载该文件 serve: - css/main.cs //加载静态文件(images、css、html) proxy: //设置代理。主要适用于对于大型的应用程序(与服务器进行交互的)进行测试 - {matcher: "/matchedPath", server: http://localhost:7000} - {matcher: "/wildcardPath/*", server: http://localhost:8000/} - {matcher: "*", server: http://localhost/whatever} timeout: 90 //设置超时时间 |
4.打开视图windows ------ show view ----- javascript ------ JsTestDriver
5.启动服务器,点击需要测试的浏览器,启动浏览器

6.配置运行环境,运行test

6.1 创建新的test实例:

6.2 配置需要测试实例所在的项目

6.3 选择使用的配置文件

6.4 配置常用信息:字符编码、log等

6.5 配置完成后,点击run运行测试
注:在配置文件中,配置proxy的时候,可能会出现path冲突的情况,比如说:我们web应用处理后的路径是http://localhost/service,我们测试用例proxy处理后的路径就可能与其冲突,为了不影响整个应用的正常运行,建议在配置test proxy的时候加一层路径/jstd,这样可以明确的区分测试代理和web应用,应用和测试可以并行。最后,proxy适用于大型的web项目,对于个别的功能测试简单页面测试的时候,不建议使用。
此代码仅供参考,如有疑问欢迎评论:
package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 public Node( int data) { this. data = data; } //显示此节点 public void display() { System. out.print( data + " "); } } package com.tyxh.link; //单链表 public class LinkList { public Node first; // 定义一个头结点 private int pos = 0;// 节点的位置 public LinkList() { this. first = null; } // 插入一个头节点 public void addFirstNode( int data) { Node node = new Node(data); node. next = first; first = node; } // 删除一个头结点,并返回头结点 public Node deleteFirstNode() { Node tempNode = first; first = tempNode. next; return tempNode; } // 在任意位置插入节点 在index的后面插入 public void add(int index, int data) { Node node = new Node(data); Node current = first; Node previous = first; while ( pos != index) { previous = current; current = current. next; pos++; } node. next = current; previous. next = node; pos = 0; } // 删除任意位置的节点 public Node deleteByPos( int index) { Node current = first; Node previous = first; while ( pos != index) { pos++; previous = current; current = current. next; } if(current == first) { first = first. next; } else { pos = 0; previous. next = current. next; } return current; } // 根据节点的data删除节点(仅仅删除第一个) public Node deleteByData( int data) { Node current = first; Node previous = first; //记住上一个节点 while (current. data != data) { if (current. next == null) { return null; } previous = current; current = current. next; } if(current == first) { first = first. next; } else { previous. next = current. next; } return current; } // 显示出所有的节点信息 public void displayAllNodes() { Node current = first; while (current != null) { current.display(); current = current. next; } System. out.println(); } // 根据位置查找节点信息 public Node findByPos( int index) { Node current = first; if ( pos != index) { current = current. next; pos++; } return current; } // 根据数据查找节点信息 public Node findByData( int data) { Node current = first; while (current. data != data) { if (current. next == null) return null; current = current. next; } return current; } } package com.tyxh.link; //测试类 public class TestLinkList { public static void main(String[] args) { LinkList linkList = new LinkList(); linkList.addFirstNode(20); linkList.addFirstNode(21); linkList.addFirstNode(19); //19,21,20 linkList.add(1, 22); //19,22,21,20 linkList.add(2, 23); //19,22,23,21,20 linkList.add(3, 99); //19,22,23,99,21,20 linkList.displayAllNodes(); // Node node = linkList.deleteFirstNode(); // System.out.println("node : " + node.data); // linkList.displayAllNodes(); // node = linkList.deleteByPos(2); // System.out.println("node : " + node.data); // linkList.displayAllNodes(); // linkList.deleteFirstNode(); Node node = linkList.deleteByData(19); // Node node = linkList.deleteByPos(0); System. out.println( "node : " + node. data); linkList.displayAllNodes(); Node node1 = linkList.findByPos(0); System. out.println( "node1: " + node1. data); Node node2 = linkList.findByData(22); System. out.println( "node2: " + node2. data); } } |
做android和ios开发的一般都用Sqlite数据库,有的时候数据需要批量导入,那么如何导入呢?
在这里,介绍2种方法供大家参考。
一、用sqlite命令
以windows系统为例,linux下命令是一样的。
1.安装sqlite工具包
首先要安装有sqlite工具包,怎么判断安装了呢?一个简单的方法就是,在命令行里,敲sqlite3,出现下面信息:

则说明安装了。如果没有安装,可以百度一下。
2.打开一个数据库
在命令行里敲入:sqlite3 数据库,例如:sqlite3 test.db:

如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。如上图,数据库test.db就成功打开了。
3.更改分隔符
如图:

默认的分割符号是|,更改命令是:.separator 分隔符,回车。
4.导入数据
命令:.import 文件名 表名,比如.import G:/data/temp.txt student。
这里要说明的是,数据库的字符编码一般默认是UTF-8,如果数据库的中文字符是乱码,则在编辑好的txt文件用UE转换成UTF-8,再导入即可。
二、用SQLite Export工具

如图所示,这里编码选用默认,文本里不用更改为UTF-8,导入的数据不为乱码。
今天遇到一个棘手的问题
用robotium框架真机测试客户端时 跑到一半会crash
搜了一堆资料终于解决了
我的程序引起crash主要原因有两个:
1.用Robotium测试框架跑多个用例(写在同一个类里),只有第一个通过,第二个会卡顿, 导致crash
原因是若同一个类里写多个测试方法,每个测试方法都会执行一次setUp() 和tearDown()方法,所以每一个用例开始时都是用的同一个启动Activity,如果你上一个用例退出时没有返回到那个Activity,执行下一个用例时会找不到启动Activity,就报错了
解决方法:
在tearDown()里加上返回到开始Activity的方法:solo.goBackto("startActivity");
2.再跑时,发现程序还是会卡在第一个用例结束时无法退出,再检查,
tearDown方法写错了,之前按照网上资料写的,并不好使,还是会引起崩溃
@Override public void tearDown() throws Exception { try { solo.finalize();// 执行清理工作 } catch (Throwable e) { e.printStackTrace(); } Activity myActivity=getActivity(); if(myActivity!=null) myActivity.finish();// 测试结束,关闭应用程序 super.tearDown(); } |
把关闭方法修改成solo.finishOpenedActivities(); OK了,至于为什么我也没有研究,有谁知道的还请留言告诉我,不胜感激~
最后,我的工程整个tearDown方法如下:
@Override public void tearDown() throws Exception { //关闭之前先回到主页面 Boolean notClosed = true; while (notClosed) { solo.goBack(); if (solo.waitForText("确定退出客户端吗", 1, 100, false, true)) { notClosed = false; solo.clickOnButton("取消"); break; } } //关闭 try { this.solo.finishOpenedActivities(); } catch (Throwable e) { e.printStackTrace(); } Activity myActivity=getActivity(); if(myActivity!=null) myActivity.finish(); super.tearDown(); } |
使用java进行脚本开发的测试童鞋有福了,不仅自动化能做,性能测试也能做:
轻量级性能测试工具ContiPerf :
ContiPerf 是一个轻量级的测试工具能轻松地利用的JUnit 4的性能测试,测试案例,例如连续性能测试。它的灵感来自JUnit 4中与注释简单测试配置,以及用JUnitPerf的包装性能测试单元测试的想法,但更强大和更容易使用。它使用定义测试执行的特点和性能要求的Java注解。您可以标记一个测试运行一定次数,或将不断提出一定的时间执行。


示例测试代码:
import org.junit.*; import org.databene.contiperf.*; public class SmokeTest { @Rule public ContiPerfRule i = new ContiPerfRule(); @Test @PerfTest(invocations = 1000, threads = 20) @Required(max = 1200, average = 250) public void test1() throws Exception { Thread.sleep(200); } } |
本节重点:
控制滚动条到底部
有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。一般用到操作滚动条的会两个场景:
注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方。
要操作的页面元素不在吸视范围,无法进行操作,需要拖动滚动条
其实,实现这个功能只要一行代码,但由于不懂js ,所以花了不小力气找到这种方法。
用于标识滚动条位置的代码
<body onload= "document.body.scrollTop=0 ">
<body onload= "document.body.scrollTop=100000 ">
如果滚动条在最上方的话,scrollTop=0 ,那么要想使用滚动条在最可下方,可以scrollTop=100000 ,这样就可以使滚动条在最下方。
场景一
先来解决场第一个问题,法律条款是一个内嵌窗口,通过firebug工具可以定位到内嵌入窗口可以定位到元素的id ,可以通过下面的代码实现。
js="var q=document.getElementById('id').scrollTop=10000"
driver.execute_script(js)
注:由于没找到合适的例子,所没验证,从参考资料来看这种写法应该没问题,如有请反馈。
场景二
有滚动条的页面到处可见,这个就比较容易找例子,我们以操作百度搜索结果页为例:
#coding=utf-8 from selenium import webdriver import time #访问百度 driver=webdriver.Firefox() driver.get(http://www.baidu.com) #搜索 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3) #将页面滚动条拖到底部 js="var q=document.documentElement.scrollTop=10000" driver.execute_script(js) time.sleep(3) #将滚动条移动到页面的顶部 js="var q=document.documentElement.scrollTop=0" driver.execute_script(js) time.sleep(3)
driver.quit() |
相关文章:
轻松自动化---selenium-webdriver(python) (十)
轻松自动化---selenium-webdriver(python) (十二)
OSSO JOSSO(Java Open Single Sign-On)是一个开源的J2EE-based的SSO(SSO:单一登录技术是一种认证和授权机制,它允许注册用户只需要在任一成员网站上登录一次,而后授权访问其他连接的分支网站,无需再进行验证登录)基础结构.它的目的是提供一种用来解决在统一平台上进行用户集中认证的方案. Acegi Security Acegi Security为Spring Framework提供一个兼容的安全认证服务(security services). Atlassian Seraph Seraph是一个非常简单,可插入的J2EE Web应用程序安全框架.它主要基于以下几个核心组成部分:拦截器,它允许在安全事件发生(如登录/登出)的前后运行相应的代码.认证器,依赖一个后台用户系统来验证一个用户.控制器,这个控制器用来管理安全机制是否启用和失效.角色权限设置等. Kasai Kasai是一个开源100%基于Java的认证与授权框架.它提供一个完善的,易于管理的许可方案来与你应用程序相结合的.这个框架的目的是为多用户应用程序提供一个使用简单但强大的安全环境. Gabriel Gabriel是一用户权限验证安全框架.它的API很小并且易于使用. Shibboleth Shibboleth是一个针对SSO的开源项目。Shibboleth项目主要应用在校园内Web资源共享,以及校园间的应用系统的用户身份联合认证. OpenSAML OpenSAML1.1是一组开源的Java与C++类库.它实现了SAML(Security Assertion Markup Language)1.0与1.1规范. SourceID SourceID开源的联合身份认证管理.它提供了实现SAML,ID-FF和WS-Federation安全协议的工具包与项目. jGuard jGuard是一个基于JAAS(java authentication and authorization security)的Java安全框架.这个开源项目主要是简单地解决Web应用程序访问控制问题. Jpam Jpam是一个连接Java与PAM的一个中间件.PAM(Pluggable Authentication Modules)是一个在Linux,Solaris,Mac OS X和其它Unix系统上使用的标准安全体系.JPAM允许运行在这些平台上的Java程序使用PAM认证. Sun's XACML 这是一个开源的访问控制策略引擎.它用Java实现了所有XACML1.1标准必须实现的规则,同时也实现了一些可选的规则. Yale CAS 耶鲁大学开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Server)被设计成一个独立的Web应用程序(cas.war)。它目前用几个Java Servlet作为实现并且通过一个Https服务器来运行。 CAS Generic Handler CAS Generic Handler是一个插件它使得CAS具备利用不同方法((LDAP, database, files, NIS,...)来验证用户的能力。 JCas JCas实现了一个免费,开源基于Java的CAS服务器.
distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。
下面先来看看例子:
table表 字段1 字段2 id name 1 a 2 b 3 c 4 c 5 b |
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。
select distinct name from table
得到的结果是:
好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:
select distinct name, id from table
结果会是:
---------- id name 1 a 2 b 3 c 4 c 5 b |
distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。
我们再改改查询语句:
select id, distinct name from table
很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。
------------------------------------------------------------------------------------------------------------
下面方法可行:
select *, count(distinct name) from table group by name
结果:
id name count(distinct name) 1 a 1 2 b 1 3 c 1 |
最后一项是多余的,不用管就行了,目的达到。。。。。
group by 必须放在 order by 和 limit之前,不然会报错
1、什么是测试用例?
测试用例是执行测试前由测试人员编写的指导测试的文档。测试用例主要解决测什么、怎么测、如何衡量的问题。
2、测试用例的组成包括:
用例编号
用例描述:记录测试的步骤,用到的数据
预期结果:按照用例步骤操作,应该出现什么结果
测试目的:说明为什么要设计这条用例,测试点是什么
3、编写用例参考什么内容?
文档:需求文档、开发文档、用户手册
对着相应的软件编写
讨论
4、编写测试用例的方法:
1)等价类划分、边界值
2)因果图、判定表
3)正交排列方法、场景法
4)状态转换图方法
5)测试大纲方法
5、如何使用边界值方法编写测试用例?如何使用等价类划分方法编写测试用例?
按照控件的数据要求,把输入的数据分为有效等价类和无效等价类。有效等价类是对程序有意义、合法的输入,输入有效等价类后,程序应该正确计算或正常运行。无效等价类是对程序无意义、不合法的输入,输入无效等价类后,程序应该给出错误提示,或者根本不让用户输入。在测试的时候,分别从每个等价类中选取一组数据编写用例即可。比如输入“姓名”,要求1——20个字符,不能为空。这样,有效等价类就是1——20之间的数据,比如:张三;无效等价类为:小于1的字符,就是为空,另外还有大于20个字符的,比如准备一个30个字符的姓名进行测试。
边界值方法就是对输入数据的有效无效的边界点及其两边的数据进行测试。比如,刚才的姓名,要测试1个字符,0个字符和2个字符,20个字符、19个和21个字符。
版权声明:本文出自 wsophie 的51Testing软件测试博客:http://www.51testing.com/?14995102
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。
1.Kernel panic - not syncing: Attempted to kill init!
上网搜索了一些相关信息,找到了解决问题的途径。 原因在于:编译内核和busybox使用的编译器是arm-linux-gcc 4.3.2,而这个编译器默认是打开“EABI选项”的,这样编译出来的busybox就是EABI的。但是内核编译的时候,默认是把“EABI选项”关掉的。所以busybox和内核无法正常配合。把“EABI选项”打开,重新编译内核后,一切正常。
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW)
---------------------------------------------------------------------------------
2.启动时提示:cannot run '/etc/init.d/rcS': Permission denied
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 120K
cannot run '/etc/init.d/rcS': Permission denied
(none) login:
---rcS需要有执行权限,chmod 777 rcS后就好了。
------------------------------------------------------------------------
3.启动时提示输入登录用户及密码:(none) login:
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 120K
(none) login:
-----要求登录认证,我把inittab里的::respawn:-/bin/sh去掉之后就没有了
--------------------------------------------------------------------------------
4.提法不能运行文件,是因为shell脚本有非法字符(肉眼看不到,其实不是空格)
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 120K
cannot run '/etc/init.d/rcS': No such file or directory
--------rcS是shell脚本文件,我是从网上拷的,所以在行尾可能有多余的非法字符,手动输入后,就开始执行rcS文件的内容了。
--------------------------------------------------------------------
5.进不了shell,呈死机状态
::askfirst:/bin/sh
我在inittab里加上这一句就好了。
6.有两个文件找不到:
mount: mounting tmpfs on /dev/shm failed: No such file or directory
mount: mounting devpts on /dev/pts failed: No such file or directory
我们之前建立文件系统的目录结构的时候没有建立这两个目录,重新建一下就好了。
---------------------------------------------------------------------------
7.出现提示:/bin/sh: can't access tty; job control turned off
Please press Enter to activate this console.
/bin/sh: can't access tty; job control turned off
其实只要有这个-表示该shell是login shell就行了。busybox inittab的id字段是用来标识tty的,如果没有明确指明就是tty1即console。
把::askfirst:/bin/sh改为:::askfirst:-/bin/sh
可以看看busybox的examples目录下的例子就明白了。
----------------------------------------------------------------
8.通过启启信息发现,profile文件没有执行
::askfirst:/bin/sh加了“-”之后,没有执行profile文件的问题也解决了。
-----------------------------------------------------------------
9.在busybox里设置setenv时,分号“;"输入之后,后面的内容就设置不到环境变量里。
解决方法是:在分号前加反斜杠"\"!
算是一个有用的小技巧吧