代码测试(CodeTest)

1.  什么是代码测试?与传统的功能和接口测试有什么不同?

  代码测试的立足点是Code,是基于代码基础之上的,而传统的功能测试和接口测试是基于应用的,必须对应的测试系统是在运行中的。

  代码测试不会特别注重接口测试的可持续性集成。

  代码测试的特点是快捷高效准确的完成测试工作,快速推进产品的迭代。

  2.  Code Test 的方法:

  (1)  代码走读和review

  适合场景:逻辑相对简单,有较多的边界值。

  方法介绍:直接查看和阅读代码,检验逻辑是否正确。

  (2)  代码debug与代码运行中测试

  适合场景:数据构造比较困难,特殊的场景覆盖。

  方法介绍:1.直接在debug代码过程中查看数据流走向,校验逻辑。

  2.在debug过程中直接将变量的值或者对象的值直接改成想要的场景

  (3)  私有方法测试

  适合场景:需要测试的类的复杂逻辑处理是放在一个特定的方法中,而且该方法中没有使用到其他引用的bean

  方法介绍:通过反射的方式调用方法,进行测试。

  例子:

  假设有一个待测试的类叫MyApp,有一个私有方法叫getSortList, 参数是一个整形List。


/**

* Created by yunmu.wgl on 2014/7/16.

*/

public class MyApp {

private List  getSortList(List<Integer> srcList){

Collections.sort(srcList);

return srcList;

}

}

  那么测试类的代码如下:


/**

* Created by yunmu.wgl on 2014/7/16.

*/

public class MyAppTest {

@Test

public  void testMyApp() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

Class clazz = MyApp.class;

Method sortList = clazz.getDeclaredMethod("getSortList",List.class); //获取待测试的方法

sortList.setAccessible(true); //私有方法这个是关键

List<Integer> testList = new ArrayList<Integer>();//构造测试数据

testList.add(1);

testList.add(3);

testList.add(2);

MyApp myApp = new MyApp(); // 新建一个待测试类的对象

sortList.invoke(myApp,testList); //执行测试方法

System.out.println(testList.toString()); //校验测试结果

}

}

 (4)  快速搭建测试脚本环境

  适合场景:待测试的方法以hsf提供接口方法,或者需要测试的类引入了其他bean 配置。

  方法介绍:直接在开发工程中添加测试依赖,主要是junit,如果是需要测试hsf接口,则加入hsf的依赖,如果需要使用itest的功能,加入itest依赖。

  Junit 的依赖一般开发都会加,主要看下junit的版本,最好是4.5 以上

  HSF的测试依赖:以前的hsfunit 和hsf.unit 最好都不要使用了。

  <dependency>

  <groupId>com.taobao.hsf</groupId>

  <artifactId>hsf-standalone</artifactId>

  <version>2.0.4-SNAPSHOT</version>

  </dependency>

  Hsf 接口测试代码示例:

  // 启动HSF容器,第一个参数设置taobao-hsf.sar路径,第二个参数设置HSF版本

  HSFEasyStarter.start("d:/tmp/", "1.4.9.6");

  String springResourcePath = "spring-hsf-uic-consumer.xml";

  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(springResourcePath);

  UicReadService uicReadService = (UicReadService) ctx.getBean("uicReadService");

  // 等待相关服务的地址推送(等同于sleep几秒,如果不加,会报找不到地址的错误)

  ServiceUtil.waitServiceReady(uicReadService);

  BaseUserDO user = uicReadService.getBaseUserByUserId(10000L, "detail").getModule();

  System.out.println("user[id:10000L] nick:" + user.getNick());

  Hsf bean的配置示例:

  <beans>

  <bean name="uicReadService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean"

  init-method="init">

  <property name="interfaceName" value="com.taobao.uic.common.service.userinfo.UicReadService" />

  <property name="version" value="1.0.0.daily" />

  </bean>

  </beans>

  Itest的依赖:这个版本之前修复了较多的bug。

  <dependency>

  <groupId>com.taobao.test</groupId>

  <artifactId>itest</artifactId>

  <version>1.3.2.1-SNAPSHOT</version>

  <dependency>

  (5)  程序流程图校验

  适合场景:业务流程的逻辑较为复杂,分支和异常情况很多

  方法介绍:根据代码逻辑画出业务流程图,跟实际的业务逻辑进行对比验证,是否符合预期。

  (6)  结对编程

  适合场景:代码改动较小,测试和开发配对比较稳定

  方法介绍:开发修改完代码后,将修改部分的逻辑重复给测试同学,测试同学review 开发同学讲述的逻辑是否和代码的逻辑一致。

  3.   具体操作步骤:

  (1)  checkout代码,在接手项目和日常后第一件事情是checkout 对应的应用的代码

  (2)  了解数据结构与数据存储关系:了解应用的数据对象和数据库的表结构及存储关系。

  (3)  了解代码结构, 主要搞清楚代码的调用关系。

  (4)  了解业务逻辑和代码的关系:业务逻辑肯定是在代码中实现的,找到被测试的业务逻辑对应的代码,比较常见的是通过url 或者接口名称等。

  如果是webx框架的可以根据http请求找到对应的代码,如果是其他框架的也可以通过http请求的域名在配置文件中找到对应的代码。

  (5)  阅读相关代码,了解数据流转过程。

  (6)  Review 代码,验证条件,路径覆盖。

  (7)  复杂逻辑可以选用写脚本测试或者私有方法测试,或者画出流程图。

  4.  代码测试的常见测试场景举例:

  (1)  条件,边界值,Null 测试:

  复杂的多条件,多边界值如果要手工测试,会测试用例非常多。而且null值的测试往往构造数据比较困难。

  例如如下的代码:


if (mm.getIsRate() == UeModel.IS_RATE_YES) {

float r;

if (value != null && value.indexOf(‘.’) != -1) {

r = currentValue – compareValue;

} else {

r = compareValue == 0 ? 0 : (currentValue – compareValue) / compareValue;

}

if (r >= mm.getIncrLowerBound()) {

score = mm.getIncrScore();

} else if (r <= mm.getDecrUpperBound()) {

score = mm.getDecrScore();

}

mr.setIncreaseRate(formatFloat(r));

} else {

// 目前停留时间为非比率对比

if (currentValue – compareValue >=mm.getIncrLowerBound()) {

score = mm.getIncrScore();

} else if (currentValue – compareValue <= mm.getDecrUpperBound()) {

score = mm.getDecrScore();

}

}

(2)  方法测试

  某个方法相对比较独立,但是是复杂的逻辑处理

  例如下面的代码:


private void filtSameItems(List<SHContentDO> contentList) {

Set<Integer> sameIdSet = new TreeSet<Integer>();

Set<Integer> hitIdSet = new HashSet<Integer>();

for (int i = 0; i < contentList.size(); i++) {

if (sameIdSet.contains(i) || hitIdSet.contains(i)) {

continue;

}

SHContentDO content = contentList.get(i);

List<Integer> equals = new ArrayList<Integer>();

equals.add(i);

if ("item".equals(content.getSchema())) {

for (int j = i + 1; j < contentList.size(); j++) {

SHContentDO other = contentList.get(j);

if ("item".equals(other.getSchema()) && content.getReferItems().equals(other.getReferItems())) {

equals.add(j);

}

}

}

if (equals.size() > 1) {

Integer hit = equals.get(0);

SHContentDO hitContent = contentList.get(hit);

for (int k = 1; k < equals.size(); k++) {

SHContentDO other = contentList.get(k);

if (hitContent.getFinalScore() == other.getFinalScore()) {

long hitTime = hitContent.getGmtCreate().getTime();

long otherTime = other.getGmtCreate().getTime();

if (hitTime > otherTime) {

hit = equals.get(k);

hitContent = other;

}

} else {

if (hitContent.getFinalScore() < other.getFinalScore()) {

hit = equals.get(k);

hitContent = other;

}

}

}

for (Integer tmp : equals) {

if (tmp != hit) {

sameIdSet.add(tmp);

}

}

hitIdSet.add(hit);

}

}

Integer[] sameIdArray = new Integer[sameIdSet.size()];

sameIdSet.toArray(sameIdArray);

for (int i = sameIdArray.length - 1; i >= 0; i--) {

contentList.remove((int) sameIdArray[i]);

}

}

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-21 16:13:35

代码测试(CodeTest)的相关文章

安卓单元测试全攻略,让代码测试一劳永逸

本文讲的是安卓单元测试全攻略,让代码测试一劳永逸,安卓单元测试,只看这一篇就足够啦.真正的完全解析,真正的从0到1,Junit结合Mockito与Robolectric实现从M到V再到P,Jacoco扫描函数.逻辑.代码行数单元测试覆盖率100%的全面测试.你是否还在为了验证联网与未联网状态而频繁的开关WiFi开关?或者你是否还在为一个switch判断而频繁的使用debug断点setValue来观测代码的逻辑判断情况?又或者你是否还在为了校验某个UI文案的正确性而反复的比对UI稿?可能你会反问,

Eclipse 安装Clover插件进行统计代码测试覆盖率

Clover主要有以下几个优点: 快速.准确地检测测试是否覆盖代码中的所有路径 可以集成在多个IDE中,如Eclipse.NetBeans.jBuilder等 统计和分析结果可以导出为多种格式,如PDF.HTML 下面介绍的是在Eclipse中安装Clover插件进行统计代码测试覆盖率的方法. 一.安装Clover插件 打开Eclipse顶部菜单中的Help->Install New Software...,在弹出的窗口中点击右边的Add按钮,添加Clover插件的网络下载地址. 点击OK后,系

怎么用java代码测试serversocket的最大可连接数

问题描述 怎么用java代码测试serversocket的最大可连接数 不使用JMeter等压力测试软件,怎么使用java代码测试serversocket的最大可连接数? 服务器是利用serversocket,每次接收到一个socket,就提交给线程池,以下是客户端的代码 package Client; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.

12 款 JS 代码测试必备工具(翻译)_javascript技巧

每天都会产生新的代码.用户测试工具和框架.下面的列表列出了可以完成各种测试需求的代码工具.你应该调查研究一下,看这些工具是否适用于你的技术栈和技术需求. 01. Jasmine Jasmine 是一个行为驱动的测试开发框架,用于对 JavaScript 代码进行测试.它不依赖其它任何 JavaScript 框架,也不需要 DOM.它的语法简洁.明确,写测试非常容易. 02. Mocha Mocha 是一个功能丰富的 JavaScript 测试框架,既运行于 Node.js 环境中,也可以运行于浏

Cookies小代码测试出现问题

问题描述 package com.mison;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servle

C语言程序设计--导言余下的样例代码测试

本来有三个,全弄出来太无聊啦, 截取两个,是关于函数和数组基础知识的. 代码A: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int power(int m, int n); 5 int main(int argc, char *argv[]) 6 { 7 int i; 8 9 for (i = 0; i < 10; ++i) 10 printf("%2d %5d %7d\n", i, power(2,i)

java代码测试http协议505错误的解决方法

代码功能:通过java代码获取网页源代码: 所用工具:Myclipse8.5+tomcat6.0+浏览器 系统环境:windows xp旗舰版 火狐浏览器版本: IE浏览器版本:

我有一个初级入门的登录代码测试有问题,请大家帮助看一下。

问题描述 if(txtName.Text!=""&&txtPass.Text!=""){stringconnsql="DataSource=.;database=Document_Management;userid=sa;pwd=123456";SqlConnectionconn=newSqlConnection(connsql);try{conn.Open();}catch(Exceptionex){Response.Write

Eclipse+Java+OpenCV246环境搭建和代码测试

1.首先下载OpenCV2.4.6,下载的时候,选择windows版的.然后安装 2.其实安装的过程就是解压的过程,并没有什么安装向导之类的,安装完成后,我们最关心的是这个目录:opencv\build\java 如下图所示 注意:opencv-246.jar是需要在opencv的java类库,但是,真正的实现是opencv_java246.dll(X86和X64之分,关键看你的计算机是多少位的)3.建立一个Java项目 4.新建一个Java类,代码如下: [java] view plainco