C++测试与调试知识
//C++測試與調(diào)試知識 #ifndef OutputRoots_ #define OutputRoots_ template<class T> void OutputRoots(T a,T b,T c) //計算并輸出一個二次方程的根 { float d=b*b-4*a*c; if(d>0) { //兩個實根 float sqrtd=sqrt(d); std::cout<<"有兩個實根" <<(-b+sqrtd)/(2*a) << " and " <<(-b-sqrtd)/(2*a) << std::endl; } else if(d==0) { //兩個實根相同 std::cout<<"有一個唯一實根" <<-b/(2*a)<<std::endl; } else { //復數(shù)根 std::cout<<"復數(shù)根" <<std::endl <<"實數(shù)部分是" <<-b/(2*a)<<std::endl <<"虛數(shù)部分是" << sqrt(-d)/(2*a)<<std::endl; std::cout<<"即為"<<-b/(2*a)<<" + "<<sqrt(-d)/(2*a)<<"i"<<std::endl; } }; template<class T> void ComputeRootsRightMethod(T x,T a,T b,T c) { std::cout<<a<<"X*X+("<<b<<")*X+"<<c<<"=0"<<std::endl; std::cout<<"f(x,a,b,c)值為"<<a*x*x+b*x+c<<std::endl; } //OutputRoots(1,-5,6); out 2,3 (x^2-5x+6=0) //OutputRoots(1,3,2); out -1,-2 (x^2+3x+2=0); /* 什么是測試: ---- 所謂程序測試是指在目標計算機上利用輸入數(shù)據(jù), 也稱之為測試數(shù)據(jù)( test data)來實際運行該程序, 把程序的實際行為與所期望的行為進行比較。 如果兩種行為不同,就可判定程序中有問題存在。 ---- 正確性是一個程序最重要的屬性。 由于采用嚴格的數(shù)學證明方法來證明一個程序的正確性是非常困難的 (哪怕是一個很小的程序), 所以我們想轉(zhuǎn)而求助于程序測試(program test)過程來實施這項工作; ---- 然而,不幸的是,即使兩種行為相同,也不能夠斷定程序就是正確的, 因為對于其他的測試數(shù)據(jù),兩種行為又可能不一樣。 如果使用了許多組測試數(shù)據(jù)都能夠看到這兩種行為是一樣的, 我們可以增加對程序正確性的信心。通過使用 所用可能的測試數(shù)據(jù),可以驗證一個程序是否正確。 然而,對于大多數(shù)實際的程序,可能的測試數(shù)據(jù)的數(shù)量太大了, 不可能進行窮盡測試, 實際用來測試的輸入數(shù)據(jù)空間的子集稱之為測試集(test set) ---- 設計測試數(shù)據(jù) ---- 在設計測試數(shù)據(jù)的時候,應當牢記:測試的目標是去披露錯誤。 如果用來尋找錯誤的測試數(shù)據(jù)找不到錯誤,我們就可以有信心相信程序的正確性。 為了弄清楚對于一個給定的測試數(shù)據(jù),程序是否存在錯誤, 首先必須知道對于該測試數(shù)據(jù),程序的正確結(jié)果應是什么。 ---- 可以采用下面的條件來計算任何候選的測試數(shù)據(jù): 1這個數(shù)據(jù)能夠發(fā)現(xiàn)錯誤的潛力如何? 2能否驗證采用這個數(shù)據(jù)時程序的正確性? ---- 設計測試數(shù)據(jù)的技術(shù)分為兩類: 黑盒法(black box method)(最流行的黑盒法是I/O 分類及因果圖) 白盒法(white box method)(白盒法基于對代碼的考察來設計測試數(shù)據(jù)) ---- 對一個測試集最起碼的要求就是使程序中的每一條語句都至少執(zhí)行一次。這種要求被稱為語句覆蓋 在分支覆蓋(decision coverage)中要求測試集要能夠使程序中的每一個條件都分別能出現(xiàn)true和false兩種情況。 ---- */ template<class T> int Max(T a[],int n) { int pos=0; for(int i=1;i<n;i++) if(a[pos]<a[i]) pos=i; return pos; } //測試數(shù)據(jù)集a[0:4]=[2,4,6,8,9] 能語句覆蓋但不能分支覆蓋 //測試數(shù)據(jù)集a[0:4]=[4,2,6,8,9] 能語句覆蓋也能分支覆蓋 //---- /*可以進一步加強分支覆蓋的條件,要求每個條件中的每個從句(clause)既能出現(xiàn)true也能 出現(xiàn)false的情況,這種加強的條件被稱之為從句覆蓋(clause coverage) ---- 在這些白盒測試方法中,一般要求實現(xiàn)執(zhí)行路徑覆蓋。一個能實現(xiàn)全部執(zhí)行路徑覆蓋的測 試數(shù)據(jù)同樣能實現(xiàn)語句覆蓋和分支覆蓋,然而,它可能無法實現(xiàn)從句覆蓋。全部執(zhí)行路徑覆蓋 通常會需要無數(shù)的測試數(shù)據(jù)或至少是非??捎^的測試數(shù)據(jù),所以在實踐中一般不可能進行全部 執(zhí)行路徑覆蓋。 調(diào)試(debug) ------------- 測試能夠發(fā)現(xiàn)程序中的錯誤。一旦測試過程中產(chǎn)生的結(jié)果與所期望的結(jié)果不同,就可以了 解到程序中存在錯誤。確定并糾正程序錯誤的過程被稱為調(diào)試(debug)。 ---- 1可以用邏輯推理的方法來確定錯誤語句。如果這種方法失敗,還可以進行程序跟蹤,以 確定程序什么時候開始出現(xiàn)錯誤。如果對于給定的測試數(shù)據(jù)程序需要運行很多指令,因而需要 跟蹤太多語句,很難人工確定錯誤,此時,這種方法就不太可行了,在這種情況下,必須試著 把可疑的代碼分離出來,專門跟蹤這段代碼。 2不要試圖通過產(chǎn)生異常來糾正錯誤。異常的數(shù)量可能會迅速增長。必須首先找到需要糾 正的錯誤,然后根據(jù)需要重新設計。 3在糾正一個錯誤時,必須保證不會產(chǎn)生一個新的、以前沒有的錯誤。用原本能使程序正 確運行的測試數(shù)據(jù)來運行糾正過錯誤的程序,確信對于該數(shù)據(jù),程序仍然正確。 4在測試和調(diào)試一個有錯的程序時,從一個與其他函數(shù)獨立的函數(shù)開始。這個函數(shù)應該是 一個典型的輸入或輸出函數(shù)。然后每次引入一個尚未測試的函數(shù),測試并調(diào)試更大一些的程序。 這種策略被稱為增量測試與調(diào)試( incremental test and debug)。在使用這種策略時,可以有理 由認為產(chǎn)生錯誤的語句位于剛剛引入的函數(shù)之中。 */ #endif // Win32Console.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include "baseCplusplus1.h"; #include "baseClassRelInfo2.h"; #include "TestProgram.h" void baseCplusplusOp(); //C++函數(shù)模板遞歸一二維數(shù)組動態(tài)分配存儲空間實例1 void baseClassRelInfo2(); //C++類的相關(guān)基礎2 void baseClassRelInfo2_1(); //C++類的相關(guān)基礎2 //操作符重載 void ComputeRoots(); //計算根公式 void findMax(); //尋找最大值 int _tmain(int argc, _TCHAR* argv[]) { baseCplusplusOp(); baseClassRelInfo2(); std::cout<<"/操作符重載"<<std::endl; baseClassRelInfo2_1(); std::cout<<"計算根公式"<<std::endl; ComputeRoots(); std::cout<<"尋找最大值"<<std::endl; findMax(); //暫停操作 char str; std::cin>>str; //程序結(jié)束 return 0; } //計算根公式 void ComputeRoots() { OutputRoots(1,-5,6); //out 2,3 ComputeRootsRightMethod(2,1,-5,6); OutputRoots(1,3,2); //out -1,-2 OutputRoots(1,-3,2); //out 2,1 OutputRoots(4,4,1); //out 0 OutputRoots(1,-8,16); //out 4 OutputRoots(1,2,5); //out -1+2i } //尋找最大值 void findMax() { int a[]={2,4,6,8,9}; std::cout<<Max(a,5)<<std::endl; int aa[]={4,2,6,9,8}; std::cout<<Max(aa,5)<<std::endl; } ?
轉(zhuǎn)載于:https://www.cnblogs.com/sqlite3/archive/2010/07/08/2566933.html
總結(jié)
以上是生活随笔為你收集整理的C++测试与调试知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于ibatis.net 和 Nhibe
- 下一篇: c#取远程数据示例