从代码里提取的测试需求

服务器端的测试,软件需求基本等于产品说明书,只有大概,没有详尽。再需求不充分的情况下,我们可以从哪些方面来挖掘测试需求呢?

现已知需求:服务器支持对客户端的版本升级,存在两种升级规则:

第一:最低版本升级:按照客户端的类型,如果当前版本小于最低版本要求则需要进行升级

第二:指定版本升级:根据某个客户端类型+版本信息,强制或者提示升级到指定版本

如果同时满足2种升级规则,优先匹配第二种。配置文件如下:

一般测试人员都能分析到以下两点如下:

  1. 两种规则同时满足时,怎么选择?
  2. 第一种规则:当前版本《 最低版本,则提示需要进行升级。那当前版本》最低版本的时候呢?

第二种规则:当前版本《 最低版本,则需要强制升级,那当前版本》最低版本的时候呢?

假设当前客户端类型只有一种,设只有PC客户端,一般都能写出以下的测试用例:

那这样的设计,算全面了么,再深入一层分析,又缺少了什么呢?

1、  产品和两个规则的关系如何?1对1,1对多?每个产品都可能存在多个指定版本升级的规则?

2、  总共运营上存在14个产品,每类产品都需要覆盖测试?

3、  客户端与服务器是怎么进行交互的,客户端传递什么数据到服务器,服务器返回什么给客户端?升级的整个流程是什么样的,清楚么?

4、  之前考虑的第二点,太粗糙,》之外的,除了《,还有 = 。

客户端和服务器端的接口核心函数代码如下:

//GetProductItem为服务器端与客户端之间的接口函数,客户端传szProductID,szVersion给服务器端,然后服务器就此作出判断,返回正确的数据到item类中,供客户端调用。

bool CConfig::GetProductItem(const CHAR *szProductID, const CHAR *szVersion, ProductItem &item)

{

// 先根据ProductID确定产品的ProductDetail

ProductDetail *pProduct = FindProduct(szProductID);

//如果客户端传递的szProductID为空,则用默认的

if (!pProduct)

{

//m_strDefaultProduct存储从配置文件中读取的DefaultProduct的ID

pProduct = FindProduct(m_strDefaultProduct.c_str());

//如果默认的为空,则直接返回false

if (!pProduct)

{

return false;

}

}

//根据szVersion在确定的ProductID内得到grayupdate配置的版本

//find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器

auto iter = pProduct->mapVersionInfo.find(szVersion);

//如果没有找到,就用默认版本信息(强制升级块)

if (iter == pProduct->mapVersionInfo.end())

{

iter = pProduct->mapVersionInfo.find(DEFAULT_VERSION);

if (iter == pProduct->mapVersionInfo.end())

{

return false;

}

}

// 在服务器端将strMinVersion,strNewVersion,lsDownloadUrl存在item,返回给客户端,由客户端控制怎么强制升级还是提示升级。

item.strProductID = pProduct->strProductID;

item.strWebServicesURL = m_strWebServicesURL;

item.strMinVersion = iter->second.strMinVersion;

item.strNewVersion = iter->second.strNewVersion;

item.lsDownloadUrl = iter->second.lsDownloadUrl;

return true;

}

FindProduct的实现过程如下:

服务器在等待客户端发送客户端相关数据过来前,服务器启动时,就加载配置文件,读取对应服务器下的配置文件<CONFIG>里的数据到szConfig中,然后调用LoadConfig的方法。

//LoadConfig方法作用:将配置文件里的数据,默认配置的产品ID读取到szProductID,产品的其他所有信息读取到pProductDetail中。

BOOL CConfig::LoadConfig(const CHAR *szConfig)

{

if (NULL == szConfig)

return FALSE;

TiXmlElement element("");

element.Parse(szConfig, NULL, TIXML_ENCODING_UTF8);

// 取配置信息中DefaultProduct元素的数据存在szProductID中。

const CHAR *szProductID = TiXmlGetValue(&element, "DefaultProduct");

if (!szProductID || strcmp(szProductID, "") == 0)

{

return FALSE;

}

m_strDefaultProduct = szProductID;

// szWebServicesURL 变量暂时未被使用(以前的旧代码),可以忽略

const CHAR *szWebServicesURL = TiXmlGetValue(&element, "WebServicesURL");

if (szWebServicesURL)

{

m_strWebServicesURL = szWebServicesURL;

}

//读取配置文件中Product的第一个元素的信息,将里面的值返回pProductDetail类中

TiXmlElement *pProductDetail=element.FirstChildElement("Product");

if (!pProductDetail || !ReadProductDetail(pProductDetail))

{

return FALSE;

}

return TRUE;

}

ReadProductDetail函数的作用就是将product下对应的部分数据,读取到pProductDetail的成员变量strProductID和mapVersionInfo(版本集合内).

看完代码,得知的大致流程如下:首先服务一启动,就会将每个Product下的pProductDetail保存起来,然后客户端发送szProductID,szVersion给服务器端,服务器端首先是在m_lsProduct(list)下查找出自己对应的pProductDetail信息,如果没有找到,则使用默认版本,然后根据szVersion在确定的ProductID内得到grayupdate配置的版本,如果没有找到,就用默认版本信息,将得到的数据都保存在item类,返回给客户端。

那思考之前的疑惑,解答如下:

  1. 存在一个产品,有多个指定版本升级的情况,测试用例需要增加。
  2. 运营线是有14个,但是根据程序内部实现方法(容器循环控制找产品ID),是没必要配置14个的,测试4个,4个产品都能依次正常通过测试,就能保证14个没问题。
  3. 交互过程,接口输入输出已表明。
  4. 等于的时候是什么情况,得与开发沟通。

修正测试点如下:

时间: 2024-10-11 05:57:08

从代码里提取的测试需求的相关文章

一个从源代码里提取中文字符串的java类

工作中需要优化代码里的中文警示语和异常信息,实在比较多,所以就写了个程序专门从代码里提取中文字符串. java做的,比较简单,放上来备忘 package com.extractstr.app; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 搜索字符串并输出到控制台 */ public class ExtractStr { pub

代码审核:安全性测试方案

安全性测试方案 一.静态代码测试 主要通过对源代码进行安全扫描,根据程序中数据流.控制流.语义等信息与其特有软件安全规则库进行匹对,从中找出代码中潜在的安全漏洞.   代码审计工具RIPS:   介绍:RIPS是一个用php编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘PHP源代码潜在的安全漏洞.渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码.由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认.RIPS能够检测XSS, SQL注入, 文件泄露,Hea

iOS 疑难杂症(什么鬼系列)— — 在 Storyboard 里 Add Size Class Customization 后再从代码里无法修改的问题

前言 公司的产品同时适配 iPhone 和 iPad ,并坚持用 Storyboard 来做适配,今天又踩一个坑(以前遇到过)还以为是 XCode 的鬼毛病. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 一.目的/需求 在 iPhone 4.iPhone 6.iPad 上文字用不同的字号.图片宽高也要不同 二.问题 如下图所示:在 Storyboard 上给 UILab

代码里语句的顺序狠重要。。。

有时候你千调万调,明明代码的执行逻辑没错啊,明明我得到了数据啊,为什么调试的时候eclipse告诉我空值嘛,有时候很有可能是你的代码的位置不对,或者你放入了一个错误的代码,影响了它后面代码的正常执行... 最后的结果是逗比可笑的,因为你语句放错了位置... 例如:1.我在加载评论内容的时候,首先获取edittext的内容,然后传给服务器,但是调试发现,服务器获取的是空值...  因为我getText().toString()的时候,这句话写在了另一个函数里面,及时你把得到的text声明为fina

从苹果系统InstallESD.dmg里提取IOS

右键下载的Mac OS X Mountain Lion镜像:InstallESD.dmg,选择7-zip------打开压缩包 2.双击InstallMacOSX.pkg 3.选中InstallESD.dmg,点击上面的提取,然后选取目录提取这个文件 4.打开软碟通,点击文件----打开,选择刚才提取的InstallESD.dmg文件 5.选择工具-----格式转换 6.设置输入的文件夹,然后选择标准ISO,点击转换 从苹果系统InstallESD.dmg里提取IOS,布布扣,bubuko.co

测试需求内容

测试需求名称* 测试需求编号* 需求来源:规格/设计报告 评审状态:已评审/未评审 重要性:高/中/低 紧迫性:高/中/低 优先级:高/中/低 业务前提 测试需求状态:新增/修改 创建人* 创建日期* 业务功能说明* 业务要素分析:输入/输出 业务规则描述* 正用例 反用例

C语言代码里不能用goto?

当我学C语言时,老师整天告诉我:"不要使用goto, 这是一个坏习惯, 这种写法很烂,而且很危险!"等等. 但是为什么那么多内核程序员那么喜欢用goto呢? 在这段linux内核 https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c  代码里,我觉得可以用简单的一个while替换掉,如: while(condition) { } //或 do { }while(condition); 注:这段代码来自tor

sos 怎么在代码里设置将一个imagebutton放在屏幕的中间

============问题描述============ 怎么在代码里设置将一个imagebutton放在屏幕的中间 ============解决方案1============ LinearLayout.LayoutParams btParams =  new LinearLayout.LayoutParams (width, height); btParams.gravity = Gravity.CENTER; ============解决方案2============ framelayout

【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体

有没有发现越往后写,旁白出现的次数越少? 是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作. 不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www.benmutou.com/archives/2176 文章来源:笨木头与游戏开发 1.找遍全世界,只为了发现你--FindGameObjectWithTag 还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的. 先给我