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

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

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

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

如果同时满足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. 等于的时候是什么情况,得与开发沟通。

修正测试点如下:

转载于:https://www.cnblogs.com/loleina/p/5091114.html

从代码里提取的测试需求相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> 工作中需要优化代码里的中文警示语和异常信息,实在比较多,所以就写了个程序专门从代码里提取中文字符串. java做的,比较简单, ...

  2. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    -------------------------------------- 单元测试Express/NodeJs 个人理解, 1,如果不是测试http请求的单元测试,用Mocha, Chai等基本够 ...

  3. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...

    原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...

  4. python从图片里提取主要颜色

    一.需求: 从一张图片里提取主要的几种颜色 二.效果: 三.代码 from PIL import Image, ImageDraw, ImageFontdef get_dominant_colors( ...

  5. android动态设置src,Android 代码里设置ImageView的src和background

    设置ImageView的src: image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); String path= ...

  6. 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅

    [摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新. 如果你对前端的理解还是写写页面绑绑事件,那 ...

  7. 从循环条件的代码里,我能在面试中甄别程序员是否是高级

    一般来说,工作经验满3后,程序员就达到了高级程序员的年限要求,但能力上是否达到?又如何在面试里短短30分钟里验证程序员是否达到高级程序员的水准?我会那个大家一定用到过的循环语句来作为面试题. 我们可以 ...

  8. One order search的框架代码里,硬编码了要去取Interaction object相关的数据

    One order search的框架代码里,硬编码了要去取Interaction object相关的数据,见下图214行方法:get_io_info:里面有个开关: 这个开关的配置地址: 我把这个功 ...

  9. 代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...

    http://www.aqee.net/express-names-in-code-bad-vs-clean/ 编程初学者总是把大量的时间用在学习编程语言,语法,技巧和编程工具的使用上.他们认为,如果 ...

最新文章

  1. 计算机类东北大学和大连理工,东北大学VS大连理工大学,谁才是第一,辽宁本地考生也两难...
  2. javascript-----DOM文档对象模型
  3. 白话详解TCP的三次握手到底做了些什么!!!
  4. win10中配置Java完整教程
  5. python趣味编程100例-达人迷 Python趣味编程10例
  6. 高中电子技术——指针式万用表调零
  7. MSRA-USTC 计算机科学领域前沿进展新年第一讲
  8. 终于在MAC上把OpenJDK8-u272编译通过了
  9. 1004. 成绩排名 (20)
  10. android模拟qq登陆,模拟qq登录
  11. 用Python批量生成字幕图片用于视频剪辑
  12. 车牌检测License Plate Detection and Recognition in Unconstrained Scenarios
  13. 【归纳】对于S3C2440A芯片的认知和使用理论再学习
  14. AAAI2021知识图谱论文集
  15. 爱的台阶之危险流浪者
  16. submit 和 button的区别
  17. 判断两条线段是否相交 java_判断两个线段是否相交02
  18. tableau用数据分组_对数据进行分组
  19. Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
  20. ESD防护选型思路(一)

热门文章

  1. 设计模式(中介者模式-对象去耦)
  2. mybaties与hibernate的不同点
  3. 小米羊城通余额不足服务器维护,再不怕羊城通余额不够了!地铁站现自助补票“神器”...
  4. 破解栅栏密码python脚本
  5. 博弈-sg函数的原理和优化(hdu-1536)
  6. 计算机用户账户无法打开浏览器,请问怎么样禁止一个电脑用户使用IE浏览器
  7. vue-element-admin中 vuex 的使用
  8. 汽车电子专业知识篇(九)-charge pump的原理介绍
  9. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法
  10. mongo-express 远程代码执行漏洞(CVE-2019-10758)