从代码里提取的测试需求

摘要:
对于服务器端测试,软件需求基本上与产品规范相同,只是近似的,而不是详尽的。在需求不足的情况下,我们可以从哪些方面探索测试需求?假设目前只有一种类型的客户端,并且只有PC客户端,通常可以编写以下测试用例:这种设计是否全面?进一步分析后缺少什么?

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

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

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

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

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

从代码里提取的测试需求第1张

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

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

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

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

从代码里提取的测试需求第2张

 从代码里提取的测试需求第3张

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

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的实现过程如下:

从代码里提取的测试需求第4张

服务器在等待客户端发送客户端相关数据过来前,服务器启动时,就加载配置文件,读取对应服务器下的配置文件<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. 等于的时候是什么情况,得与开发沟通。

 修正测试点如下:

从代码里提取的测试需求第5张

从代码里提取的测试需求第6张

 从代码里提取的测试需求第7张

免责声明:文章转载自《从代码里提取的测试需求》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DIN 模型速记C# 主窗按鈕的權限控制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mac下使用svn

原文地址:http://www.cnblogs.com/mjios/archive/2013/03/10/2952258.html 本文目录在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简单的配...

IOCP 浅析(java代码实现)

随着计算机技术,尤其是网络技术的飞速发展,如今的程序开发人员不仅仅局限于基于单机运行或单一线程的应用程序的开发。服务器端 / 客户端模式的最显著的特点是一个服务器端应用能同时为多个客户端提供服务。而传统的服务器端 / 客户端模式通常为每一个客户端创建一个独立的线程,这种实现方式在客户端数量不多的情况下问题不大,但对于类似于铁路网络订票这样的瞬间客户数量巨大...

[Kotlin参考]一、总览-(1)服务器端Kotlin

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(let_us_code)➤博主域名:https://www.zengqiang.org➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。...

C# Socket网络编程精华篇

我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型     当然这里我们只讨论重要的四层        01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用。http协议在应用层运行。        02,传输层(Tan...

分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击

SOA(面向服务的架构):Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。这样做的好处就是,系统之间的调用很方便,A系统要用到B系统,直接调用B系统的服务层就可以了。 集群就是多...