从代码里提取的测试需求
? ? ? ?服務(wù)器端的測試,軟件需求基本等于產(chǎn)品說明書,只有大概,沒有詳盡。再需求不充分的情況下,我們可以從哪些方面來挖掘測試需求呢?
現(xiàn)已知需求:服務(wù)器支持對客戶端的版本升級,存在兩種升級規(guī)則:
第一:最低版本升級:按照客戶端的類型,如果當(dāng)前版本小于最低版本要求則需要進(jìn)行升級
第二:指定版本升級:根據(jù)某個(gè)客戶端類型+版本信息,強(qiáng)制或者提示升級到指定版本
????? 如果同時(shí)滿足2種升級規(guī)則,優(yōu)先匹配第二種。配置文件如下:
一般測試人員都能分析到以下兩點(diǎn)如下:
? ? ? ? ? 第二種規(guī)則:當(dāng)前版本《 最低版本,則需要強(qiáng)制升級,那當(dāng)前版本》最低版本的時(shí)候呢?
?假設(shè)當(dāng)前客戶端類型只有一種,設(shè)只有PC客戶端,一般都能寫出以下的測試用例:
?
??那這樣的設(shè)計(jì),算全面了么,再深入一層分析,又缺少了什么呢?
1、? 產(chǎn)品和兩個(gè)規(guī)則的關(guān)系如何?1對1,1對多?每個(gè)產(chǎn)品都可能存在多個(gè)指定版本升級的規(guī)則?
2、? 總共運(yùn)營上存在14個(gè)產(chǎn)品,每類產(chǎn)品都需要覆蓋測試?
3、? 客戶端與服務(wù)器是怎么進(jìn)行交互的,客戶端傳遞什么數(shù)據(jù)到服務(wù)器,服務(wù)器返回什么給客戶端?升級的整個(gè)流程是什么樣的,清楚么?
4、? 之前考慮的第二點(diǎn),太粗糙,》之外的,除了《,還有 = 。
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
客戶端和服務(wù)器端的接口核心函數(shù)代碼如下:
//GetProductItem為服務(wù)器端與客戶端之間的接口函數(shù),客戶端傳szProductID,szVersion給服務(wù)器端,然后服務(wù)器就此作出判斷,返回正確的數(shù)據(jù)到item類中,供客戶端調(diào)用。
bool CConfig::GetProductItem(const CHAR *szProductID, const CHAR *szVersion, ProductItem &item)
{
// 先根據(jù)ProductID確定產(chǎn)品的ProductDetail
??? ProductDetail *pProduct = FindProduct(szProductID);
??? //如果客戶端傳遞的szProductID為空,則用默認(rèn)的
??? if (!pProduct)
??? {
? ?//m_strDefaultProduct存儲從配置文件中讀取的DefaultProduct的ID
????? pProduct = FindProduct(m_strDefaultProduct.c_str());
?? //如果默認(rèn)的為空,則直接返回false
??????? if (!pProduct)
??????? {
??????????? return false;
??????? }
?}
?
//根據(jù)szVersion在確定的ProductID內(nèi)得到grayupdate配置的版本
//find()函數(shù)返回一個(gè)迭代器指向鍵值為key的元素,如果沒找到就返回指向map尾部的迭代器
??? auto iter = pProduct->mapVersionInfo.find(szVersion);
??? //如果沒有找到,就用默認(rèn)版本信息(強(qiáng)制升級塊)
??? if (iter == pProduct->mapVersionInfo.end())
??? {
??????? iter = pProduct->mapVersionInfo.find(DEFAULT_VERSION);
??????? if (iter == pProduct->mapVersionInfo.end())
??????? {
??????????? return false;
??????? }
??? }
?
// 在服務(wù)器端將strMinVersion,strNewVersion,lsDownloadUrl存在item,返回給客戶端,由客戶端控制怎么強(qiáng)制升級還是提示升級。
??? 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的實(shí)現(xiàn)過程如下:
服務(wù)器在等待客戶端發(fā)送客戶端相關(guān)數(shù)據(jù)過來前,服務(wù)器啟動時(shí),就加載配置文件,讀取對應(yīng)服務(wù)器下的配置文件<CONFIG>里的數(shù)據(jù)到szConfig中,然后調(diào)用LoadConfig的方法。
//LoadConfig方法作用:將配置文件里的數(shù)據(jù),默認(rèn)配置的產(chǎn)品ID讀取到szProductID,產(chǎn)品的其他所有信息讀取到pProductDetail中。
BOOL CConfig::LoadConfig(const CHAR *szConfig)
{
??? if (NULL == szConfig)
??????? return FALSE;
?
??? TiXmlElement element("");
element.Parse(szConfig, NULL, TIXML_ENCODING_UTF8);
?
// 取配置信息中DefaultProduct元素的數(shù)據(jù)存在szProductID中。
??? const CHAR *szProductID = TiXmlGetValue(&element, "DefaultProduct");
??? if (!szProductID || strcmp(szProductID, "") == 0)
??? {
??????? return FALSE;
??? }
??? m_strDefaultProduct = szProductID;
?
// szWebServicesURL 變量暫時(shí)未被使用(以前的舊代碼),可以忽略
? const CHAR *szWebServicesURL = TiXmlGetValue(&element, "WebServicesURL");
??? if (szWebServicesURL)
??? {
??????? m_strWebServicesURL = szWebServicesURL;
}
?
//讀取配置文件中Product的第一個(gè)元素的信息,將里面的值返回pProductDetail類中
?? TiXmlElement *pProductDetail=element.FirstChildElement("Product");
??? if (!pProductDetail || !ReadProductDetail(pProductDetail))
??? {
??????? return FALSE;
??? }
??? return TRUE;
}
?ReadProductDetail函數(shù)的作用就是將product下對應(yīng)的部分?jǐn)?shù)據(jù),讀取到pProductDetail的成員變量strProductID和mapVersionInfo(版本集合內(nèi)).
? ? ?看完代碼,得知的大致流程如下:首先服務(wù)一啟動,就會將每個(gè)Product下的pProductDetail保存起來,然后客戶端發(fā)送szProductID,szVersion給服務(wù)器端,服務(wù)器端首先是在m_lsProduct(list)下查找出自己對應(yīng)的pProductDetail信息,如果沒有找到,則使用默認(rèn)版本,然后根據(jù)szVersion在確定的ProductID內(nèi)得到grayupdate配置的版本,如果沒有找到,就用默認(rèn)版本信息,將得到的數(shù)據(jù)都保存在item類,返回給客戶端。
那思考之前的疑惑,解答如下:
?修正測試點(diǎn)如下:
?
轉(zhuǎn)載于:https://www.cnblogs.com/loleina/p/5091114.html
總結(jié)
以上是生活随笔為你收集整理的从代码里提取的测试需求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去武当山旅游住哪里最好?
- 下一篇: Fragment基础讲解