测试用例是
软件测试的基础,是测试人员和开发团队其他成员深入了解产品开发需求的介质之一,也是产品质量的保障。因此合理设计测试用例不仅有助于掌握客户的产品真实需求,使得研发团队所有人员对需求的理解处于同一平面上,也确保产品在整个动态的研发过程中,始终符合用例的设计,实现用户最终期望的功能。
在传统开发模式中,需求分析往往占用较长时间,分析阶段由核心的开发人员和测试人员参与。在进入研发阶段后,将需求传递给其他开发和测试人员,测试人员根据需要在设计完测试用例和开发完成以后,进行各种类型的测试。这样的结果往往由于测试人员没有参与最初的需求讨论,因此对需求的理解存在一定偏差,很多用例的编写基于测试人员的假设。而且因为开发周期较长,最终交付的功能已经发生改变。
在
敏捷开发模式中,测试人员和开发人员的节奏是同步的,即开发人员增量地开发功能的同时或甚至之前,测试人员也增量地设计相应的测试用例,等功能完成后马上可以对功能性测试。对于还未开始开发或者需求暂不明确的功能,不进行测试用例的深度分析
工作。这样就能把更多的精力投入到最重要功能上去。
功能性测试用例和需求的关联
在
敏捷测试中,需求一般以用户故事的形式存在,是将用户的需求用实例或者故事的方式记录到待办事项列表中(backlog)。 测试用例和用户故事之间是紧密关联的,在产品经理(PO)设计、解释完成用户故事后,测试人员根据用户故事设计测试用例。测试用例可以是对用户故事验收标准的细分,也可以把多个用户故事进行串联形成一个用例,这取决于用户故事和测试用例设计的粒度大小。由于用户故事会随着需求的细化和拆分,因此很难对用户故事和测试用例做一一对应,而且后期维护成本较高,因此需要在用户故事和测试用例中增加模块属性,来管理测试用例和用户故事之间的关联关系。而且两者应该在一个统一平台进行维护和更新。
非功能性测试用例和需求的关联
对于非功能性的测试用例,往往并不关联具体功能模块,但是会有对应的用户故事,例如:性能需求,安全需求等,建立这类测试的测试用例的时候,可以通过建立性能模块,安全模块等并不存在的模块,和其他用例等同处理。
单元/组件测试用例的关联
敏捷
软件开发的其中一个非常有用的实践是测试驱动开发,这需要开发人员编写
单元测试,在单元测试过程中,对于复杂逻辑的函数或者组件,也需要设计单元测试用例。这些测试用例本身不以实际文档的形式存在用例库中,往往和测试人员一起讨论并参考测试人员设计的测试用例来进行编写签入到单元测试中。因此做测试用例个数统计时,需要包括单元/组件测试测试用例数量,或者为单元测试/组件测试单独设立统计指标。同时没有特别必要和模块或者用户故事做关联。
11-3URLTestDemo
1、File -> New -> Project
在左边模板中选择Visual C#里的Web,对应到的项目类型选择ASP.NET MVC3 Web Application,并给项目取名字为11-3URLTestDemo,默认的解决方案名自动为相应的11-3URLTestDemo。
2、在解决方案管理器中,鼠标右击解决方案名字Solution’ 11-3URLTestDemo’,选择Add -> New Project,如下图。
打开“Add New Project”对话框后,在左边的模板选择Visual C#里的
Test,对应的项目类型选择Test Project,并取名字为URLTestDemo.UnitTests,如下图。
创建好项目后,可以将不用的Class1.cs文件和URLTestDemo.UnitTests项目中的UnitTest1.cs文件删除掉。
3、给URLTestDemo.UnitTests项目添加Moq程序包和对项目11-3URLTestDemo的依赖。
在URLTestDemo.UnitTests项目名上右击鼠标,选择Manage NuGet Packages…,在打开的对话框中在线搜索Moq,并安装。再次在URLTestDemo.UnitTests项目名上右击鼠标,选择Add Reference,在打开的对话框中选择对项目11-3URLTestDemo的依赖。
Linux内置支持keepalive机制,为了使用它,你需要使能TCP/IP网络,为了能够配置内核在运行时的参数,你还需要procfs和sysctl的支持。
这个过程涉及到keepalive使用的三个用户驱使的变量:
tcp_keepalive_time:表示的是最近一次数据包(简单的不含数据的ACKs包)发送与第一次keepalive探针发送之间的时间间隔;当连接被标记为keepalive之后,这个计数器就不会再使用。
tcp_keepalive_intvl:表示的是并发keepalive探针之间的时间间隔。
tcp_keepalive_probes:在确定连接已经断开并且通知应用层之前所发送的没有得到回复的探针数。
对于这三个参数可以在Linux系统的终端中查看和修改它们的缺省值:
查看三个参数的值:
[root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 [root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 [root@Server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_probes 9 |
通过命令对这三个参数值进行修改(图中将三个参数值分别设为:600、60、20):
[root@Server3 ~]# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
[root@Server3 ~]# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
[root@Server3 ~]# echo 6 > /proc/sys/net/ipv4/tcp_keepalive_probes
这种方式重置三个参数值,在系统重启后三个参数的值又会恢复到默认值,具体如何让系统永远记住自己设置的值,可参考其他资料,我们现在关系的是如何在程序中使用keepalive机制并设置这三个参数的值。
在程序中使用keepalive机制
想在程序中使用这种机制,只需要使用setsockopt()函数。
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。
下面为setsockopt()函数的原型:
#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
参数:
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
为了使用函数setsockopt()将某个特定的套接字的keepalive机制打开,参数s是一个socket文件描述符,必须要在这之前使用socket()函数进行创建;参数level必须设置为SOL_SOCKET;第三个参数必须设置为SO_KEEPALIVE;optval参数必须是一个布尔型整型变量,表示想要使能这个选项;最后一个参数表示第四个参数的大小。
程序实现心跳包检测机制
首先要在备份机和源机之间建立一个专门的socket链路来进行心跳检测。
在源机端,在进行数据迁移之前,会建立一个socket来监听备份机的连接,并将这个socket和对应的处理函数放入原软件的io处理列表中,代码如下:
int listenfd; struct sockaddr_in server_sin; /* establish socket */ listenfd=socket(AF_INET,SOCK_STREAM,0); server_sin.sin_family=AF_INET; server_sin.sin_addr.s_addr=htonl(INADDR_ANY); server_sin.sin_port=htons(PORT); bind(listenfd,(struct sockaddr *)&server_sin,sizeof(server_sin)); /* establish end */ listen(listenfd,1024); qemu_set_fd_handler2(listenfd, NULL, tcpkeepalive_server, NULL, (void *)(intptr_t)listenfd); 该socket对应的处理函数如下: static void tcpkeepalive_server(void *opaque) { int connfd; struct sockaddr_in client_sin; socklen_t client_len=sizeof(client_sin); int listenfd = (intptr_t)opaque; connfd=accept(listenfd,(struct sockaddr *)&client_sin,&client_len); } |
在备份机端,当其开始作为备份机时,会建立socket连接源机的监听端,并设置对应的tcpkeepalive参数,然后将socket和对应的处理函数加入io处理列表。
我们建立的socket是一个心跳检测专用链路,其上不会有数据流动,只有一种情况备份机端会收到数据,那就是源端出现了故障,tcpkeepalive机制会返回一个错误信息,所以捕捉到了这个信息,备份机就会跳转到对应的处理函数,接替源机开始运行。
对应代码如下:
int sockfd; struct sockaddr_in sin; int optval; socklen_t optlen = sizeof(optval); sockfd=socket(AF_INET,SOCK_STREAM,0); sin.sin_family=AF_INET; sin.sin_addr.s_addr=addr.sin_addr.s_addr; sin.sin_port=htons(PORT); optval = 1; setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); optval = 5; setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &optval, optlen); optval = 1; setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, &optval, optlen); optval = 1; setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, &optval, optlen); connect(sockfd,(struct sockaddr *)&sin,sizeof(sin)); qemu_set_fd_handler2(sockfd, NULL, tcpkeepalive_vm_start, NULL, (void *)(intptr_t)sockfd); |
该socket对应的处理函数很简单,就是让备份机开始运行:
static void tcpkeepalive_vm_start(void *opaque)
{
vm_start();
}
写了一个简单的
JAVA类,定时从一个ORACLE数据库取数据放到另一个mysql数据库中,写了一个脚本如下:
set classpath=.;%classpath%;./classes12.jar;./mysql-connector-java-5.1.6-bin.jar;E:\workfile\SAP-to-MYSQL\getsapdata.class set path=%path%;D:\develop\Java\jdk1.6\bin set JAVA_HOME=D:\develop\Java\jdk1.6 cd E:\workfile\SAP-to-MYSQL java getsapdata >>getsapdata.log |
手动执行的时候完全没有问题,当时加到windows计划任务里就是执行不成功,程序执行的DOS窗口一闪而过,也看不到是什么错误,网上搜了半天,也没找到可行的答案,后来在脚本里加入了延迟语句 ping -n 5 127.1>nul,才看到报的是找不到类的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: getsapdata Caused by: java.lang.ClassNotFoundException: getsapdata at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301 at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: getsapdata. Program will exit. |
明明就在这个目录下,怎么就找不到呢,迷惑,又是一阵搜索,还是没答案,想着难道windows定时任务挑分区吗,就把程序挪到C盘,结果计划任务真的执行成功了,那是怎么回事呢,想想找不到类怎么也应该是环境变量路径类的问题吧,后来想到我以前经常用DOS窗口敲命令,打开DOS窗口默认在C盘,而我的应用一般都在其他分区,所以每次敲命令比如:cd e:\work\shell,运行完后当前路径并没有改变,必须再敲一下e:,才进入到e:\work\shell目录,会不会是windows计划任务开启DOS执行窗口也是默认在C盘,我虽然在脚本里加了 cd E:\workfile\SAP-to-MYSQL命令,但实际上系统的当前路径还是会在默认的C:\Users\Administrator 目录下,我的程序
移动到C盘的时候,因为系统默认路径也在C盘,所以 cd 命令是成功进入了c盘的我的应用程序目录,但不是C盘的就不行了,网上查了下,原来cd 的时候加个 /d 参数可以直接改变盘符,哎,以前居然一致没用过,把脚本中的 cd 命令改为 cd /d E:\workfile\SAP-to-MYSQL 后,再次执行计划任务则执行成功。
本例为myeclipse+tomcat7.0+sqlserver2008配置
数据库连接池
具体步骤:
1、在server.xml中设置数据源,以sql server 2008数据库为例,如下: 在<GlobalNamingResources> </GlobalNamingResources>节点中加入,
<Resource name="jdbc/DBPool" type="javax.sql.DataSource" password="aaaaaa" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxIdle="2" maxWait="5000" username="sa" url="jdbc:sqlserver://localhost:1433;DataBaseName=COFFEE" maxActive="4"/> |
属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;
type,”javax.sql.DataSource”;
password,数据库用户密码;
driveClassName,数据库驱动;
maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
2、在你的web应用程序的web.xml中设置数据源参考,如下: 在<web-app></web-app>节点中加入,
<resource-ref> <description>DB Connection Pool</description> <res-ref-name>jdbc/DBPool</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> |
子节点说明: description,描述信息;
res-ref-name,参考数据源名字,同上一步的属性name;
res-type,资源类型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;3、在tomcat目录下的context.xml中设置数据源链接,如下:
在<Context></Context>中加入:
<ResourceLink name="jdbc/DBPool" type="javax.sql.DataSource" global="jdbc/DBPool"/> |
属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;
type,同样取”javax.sql.DataSource”;
global,同name值。
4、测试:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class Test { private static DataSource pool; public static void main(String[] args) { Context env = null; try { env = (Context) new InitialContext().lookup("java:comp/env"); pool = (DataSource)env.lookup("jdbc/DBPool"); if(pool==null) System.err.println("'DBPool' is an unknown DataSource"); } catch(NamingException ne) { ne.printStackTrace(); } Connection conn; try { conn = pool.getConnection(); String sql = "select * from allbook"; PreparedStatement ps; ps = conn.prepareStatement(sql); ResultSet rs=ps.executeQuery(); while(rs.next()){ System.out.println(rs.getString("BOOKNAME")); } } catch (SQLException e) { e.printStackTrace(); } } } |
参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。
这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。
前提:
假如,我们录制好了一个脚本(可以用badboy工具录制),在jmeter中打开,找到有用户名和密码的页面。如下:
1.我们需要“参数化”的数据,这里我用记事本写了五个用户名和密码,保存为.dat格式的文件。
我将这个文件放在了我的( D:\test.dat )路径下。关于如何得到成百上千的用户名和密码,首先要在
数据库中创建这些数据,将数据导出,整理保存,这里就不深究。
2.好,我们要编写函数来调用这个
test.dat文件,怎么弄,
点击菜单栏“选项”---->函数助手对话框,看下图。
好了,现在我们的参数化设置完成,在脚本的时候,会调用我们D盘下面的test.dat文件,第一列是用户,第二列是密码。
注意用户名和密码是一一对应的,中间用户逗号(,)隔开。
一、 安装准备
http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.0.3-x32.exe
2. 去Jira官方网站注册一个帐号,以便获取license。
https://id.atlassian.com/profile/signUp.action?application=mac&continue=https://my.atlassian.com
二、 安装
1. 双击atlassian-jira-6.0.3-x32.exe文件启动安装过程。
安装完成后默认将打开Jira Portal进行配置。
Server Language选择English(United States),其他保留默认选项,一直单击Next按钮。
当跳转到license key页面时,选择"I have an account but no key". 这时会让你输入注册帐号和密码,然后单击按钮“sign in and generate license key”,将为你自动生成一个试用版的license key. 继续直到安装完成。
这时你会看到在System Dashboard页面时License显示为
JIRA: Evaluation
(Expires in 29 days, 2 hours on 12/Mar/14)
2. Stop Jira Service
开始菜单 -> Jira -> Stop Jira Service。
三、 破解
1. 下载Jira 6.0.3破解包
http://download.csdn.net/download/joinandjoin/5542683
2. 解压破解包到你的硬盘指定目录下,然后按如下指令操作。
2.a 用atlassian-extras-2.2.2.jar替换你的JIRA的安装目录的\atlassian-jira\WEB-INF\lib同名jar包。
2.b 用atlassian-universal-plugin-manager-plugin-2.10.1.jar替换你的JIRA的安装目录的\atlassian-jira\atlassian-bundled-plugins.zip中的同名jar包。
2.c 查看你在Jira网站的注册帐号信息,按照如下格式填写好自己的license,保存为txt文件,稍后使用。
Description=JIRA: Commercial, CreationDate=你的安装日期,格式(yyyy-mm-dd), jira.LicenseEdition=ENTERPRISE, Evaluation=false, jira.LicenseTypeName=COMMERCIAL, jira.active=true, licenseVersion=2, |
MaintenanceExpiryDate=你想设置的失效日期如:2099-12-31,
Organisation=你的Company Name,
SEN=你申请到的SEN注意没有前缀LID,
ServerID=你申请到的ServerID,
jira.NumberOfUsers=-1,
LicenseID=LID你申请到的SEN,注意LID前缀不要丢掉,
LicenseExpiryDate=你想设置的失效日期如:2099-12-31,
PurchaseDate=你的安装日期,格式(yyyy-mm-dd)
(注意,各项之间以逗号分隔)
3. 启动Jira Service
开始菜单 -> Jira -> Start Jira Service
4. 访问Jira Portal,更新License。
4.a 开始菜单 -> Jira -> Access JIRA,你将进入System Dashboard。这时候你看到的License显示为“JIRA:EVALUATION”。
4.b 单击JIRA:EVALUATION链接,进入License管理页面。打开你在2.c步骤准备好的txt文件,将内容拷贝、粘贴到License文本框,单击“Add”按钮,License即更新成功。这时你应该看到License Type显示为
JIRA:Commercial
(Support and updates available until 30/Dec/99)。
恭喜,破解成功!
1: VS2010中需要添加的DLL文件如下(注意,某些DLL是在http://docs.seleniumhq.org/download/下载,请选用匹配的.net 文件夹中的DLL文件,因为同样的DLL名称的文件会在不同文件夹中,请选对文件夹)
名称
2:C#语句参照的是
网址:http://www.docin.com/p-748751347.html
3:可以
测试多种浏览器,我正在研究其中的用途中,希望能跟大家分享经验。
多种浏览器打开的语句:
ISelenium
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.baidu.com/");
//Open FireFox
ISelenium selenium = new DefaultSelenium("localhost", 4444, "*iexploreproxy", "http://www.baidu.com/");
//Open IE
ISelenium selenium = new DefaultSelenium("localhost", 4444, "*googlechrome", "http://www.baidu.com/");
4: 我再总结一下流程
参考:
http://blog.csdn.net/chadcao/article/details/7989550
1:下载IDE
2:下载并安装jdk
3:下载RC Server
http://docs.seleniumhq.org/download/
(启动Server后,就可以在VS2010中执行C#的脚本)
4:下载selenium-remote-control-1.0.3 (因为里面有相关的DLL文件可以放到VS2010中使用)
5:下载Selenium Client & WebDriver Lanugage Bindings
http://docs.seleniumhq.org/download/ (因为里面有相关的DLL文件可以放到VS2010中使用)
6:录制,编辑IDE的运行脚本,把以上相关的DLL文件放入VS2010中,运行RC Server
版权声明:本文出自 wchair 的51Testing软件测试博客:http://www.51testing.com/?153101
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。
测试build是通过TestFlight递交的,测试人员手上没有源代码,开发人员在国外,不方便共享源码,如何能做IOS的
自动化测试?
经过折腾,发现了个可能的办法,
1. 先通过TestFlight安装build
2. 再把build通过ifanbox把build导出来成为ipa文件
3. 下面就需要把ipa文件重新签名,方法有两种
方法一:
利用商业化工具签名,SeeTest支持把ipa重新签名,签名需要提供 provision文件,和开发者证书私钥和密码
方法二:
自己想办法签,代码参考如下
unzip app.ipa rm -rf Payload/MyApp.app/_CodeSignature/ cp ~/Downloads/AdHoc.mobileprovision Payload/MyApp.app/embedded.mobileprovision codesign -f -s "iPhone Distribution: Company Certificate" --resource-rules Payload/MyApp.app/ResourceRules.plist Payload/MyApp.app zip -qr app-resigned.ipa Payload/ |
其中"iPhone Distribution: Company Certificate"是你证书的common name, 别的没什么要注意的。
方法三:
网上有推荐用一个叫iresign的工具签名,其实挺好用,该工具只能
工作在mac下面
个人推荐用方法三,但是要注意一个问题,就是iresign需要你提供四个信息,一个是ipa文件,一个是provision文件,一个是证书的common name,最后一个是entitlements.plist文件。前三个想必大家都懂,但是第四个之前真没听过,网上资料也有限。
请用下面的方法生成entitlements.plist文件
/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i production.app/embedded.mobileprovision) > entitlements.plist /usr/libexec/PlistBuddy -c 'Set :get-task-allow true' entitlements.plist |
生成之后,再利用iresign,就可以做出一个可以被xcode instrument的ipa包了。
在我们日常开发
android app的时候,需要不断地进行
测试,所以使用
JUnit测试框架显得格外重要,学会JUnit可以加快应用的开发周期。
Android中建立JUnit测试环境有以下两种方法。
一、直接在需要被测试的工程中新建测试类
集成步骤:
1.在androidManifest.xml文件中添加以下代码:
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.junittest" android:label="@string/app_name" ></instrumentation> |
<uses-library android:name="android.test.runner"/>
以上代码配置是添加测试指令和引入测试环境,完整的清单文件如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.junittest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.junittest" android:label="@string/app_name" ></instrumentation> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner"/> <activity android:name="com.example.junittest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
2.新建一个测试测试类并继承AndroidTestCase类,编写测试方法,在测试方法内使用断言assert来测试要测试的方法。
3.点击右面的大纲视图,选择要测试的方法,右键,run as --->Android JUnit test
下面通过一个简单的示例来演示一下如何使用JUnit单元测试
1、先创建简单的待测试类Calculator.java
package com.example.junittest; public class Calculator { public int add(int x,int y){ return x+y; } public int sub(int x,int y){ return x-y; } public int divide(int x,int y){ return x/y; } public int multiply(int x,int y){ return x*y; } } |
2、创建一个测试类,此类需要继承自AndroidTestCase
示例代码如下:
package com.example.test; import junit.framework.Assert; import com.example.junittest.Calculator; import android.test.AndroidTestCase; import android.util.Log; public class CalculatorTester extends AndroidTestCase { private static final String TAG = CalculatorTester.class.getSimpleName(); private Calculator calculator; /** * This method is invoked before any of the test methods in the class. * Use it to set up the environment for the test (the test fixture. You can use setUp() to instantiate a new Intent with the action ACTION_MAIN. You can then use this intent to start the Activity under test. */ @Override protected void setUp() throws Exception { Log.e(TAG, "setUp"); calculator = new Calculator(); super.setUp(); } /** * 测试Calculator的add(int x, int y)方法 * 把异常抛给测试框架 * @throws Exception */ public void testAdd() throws Exception{ int result = calculator.add(3, 5); Assert.assertEquals(8, result); } /** * 测试Calculator的divide(int x, int y)方法 * 把异常抛给测试框架 * @throws Exception */ public void testDivide() throws Exception{ int result = calculator.divide(10, 0); Assert.assertEquals(10, result); } /** * This method is invoked after all the test methods in the class. * Use it to do garbage collection and to reset the test fixture. */ @Override protected void tearDown() throws Exception { Log.e(TAG, "tearDown"); calculator = null; super.tearDown(); } } |
一个好的习惯是每个测试方法都抛出异常:throws Exception,然后通过Assert对结果进行断言。
3、通过大纲视图运行测试方法
绿条表示测试通过,在代码中我们测试的时3+5是否等于8,所以结果肯定是通过的,如果我们把assertEquals()中的8改为5的话,会出现以下结果:
红条表示测试没通过,点击右边的错误信息可以定位到出错的代码行。 二、创建一个专门用于测试的工程
推荐创建专门的测试工程,因为这样可以降低代码的耦合度。
集成步骤:
1.新建工程,选择new ---- > other ---->android Test Project
2.选择要测试的工程
3.接着和第一种建立测试类的方法是一样的,这里比较简单就略过了。
使用这种方法的话,androidManifest.xml中已经自动配置好相关的参数,无需在进行配置,比较方便。