白盒测试实例

合集下载

举例黑白盒测试

举例黑白盒测试

1 客户信息管理模块1.1模块功能简要说明本模块主要是对客户基本信息的输入,可以对客户的信息进行添加、删除、修改和保存客户信息。

可以根据在客户信息表中的已去景点,想去景点,收入水平,年龄段,按单位或个人来了解客户的需求和兴趣,实行相应的优惠关怀政策,以稳定和扩大客源,加强销售管理水平。

1.2模块的界面(图1-1)图1-1 客户信息管理界面1.3模块输入或输出数据要求1.4模块处理过程的流程图描述(图1-2)图1-21.5白盒测试用例(路径覆盖)表1-11.6黑盒测试用例(等价类划分)表1-31.7控件测试用例1.按下“添加”按钮, 会把所有的textbox控件、radioButton控件和comboBox控件清空,等待管理员输入新的数据。

2.按下“删除”按钮,会把当前显示的信息删除,且会显示下一条客户的基本信息。

3.按下“修改”按钮,当前的信息都变为可写,即所有textbox控件的属性Readonly变为false,管理员可以修改上面的信息。

4.按下“保存”按钮,则可以把前面“添加按钮”、“删除按钮”、“修改按钮”所做的操作都可以保存到数据库中;但是如果姓名、性别、身份证号、联系电话、紧急联系人电话有为空的,都会弹出一个窗口告诉用户这些信息不能为空。

5.按下“重写”按钮,会把所有刚写在textbox控件、radioButton 控件和comboBox控件的内容清空,让管理员重新输入正确的信息。

6.按下“关闭”按钮,会关闭当前窗口。

2员工信息查询模块2.1模块功能简要说明本模块可以添加新员工的基本信息,可以对员工的信息进行修改、删除、保存,还可以在界面上重写信息,能直观地管理员工的基本信息。

2.2模块的界面 (图2-1)图2-1 员工信息管理界面2.3模块输入或输出数据要求2.4模块处理过程的流程图描述(图2-2)图2-22.5白盒测试用例(路径覆盖)表2-12.6黑盒测试用例(等价类划分)表2-2表2-32.7控件测试用例1.按下“添加”按钮, 会把所有的textbox控件、radioButton控件和comboBox控件清空,等待管理员输入新的数据。

白盒测试黑盒测试区别举例

白盒测试黑盒测试区别举例

白盒测试和黑盒测试的区别举例在软件测试领域,白盒测试和黑盒测试是两种常见的测试方法,它们在测试目的、实施方式和适用场景上有着明显的区别。

本文将从具体举例分析白盒测试和黑盒测试的差异,帮助读者更好地理解两者之间的区别。

白盒测试白盒测试又称为结构化测试或逻辑驱动测试,是一种基于程序内部逻辑和结构进行测试的方法。

它侧重于理解代码的内部工作原理和逻辑结构,通过检查程序的代码、路径覆盖率等方面来评估测试质量。

举例来说,假设有一个简单的函数用于计算两个数的和:def add(x, y):result = x + yreturn result在白盒测试中,测试人员会针对上述函数编写测试用例,覆盖不同的路径和边界条件,以保证程序的逻辑正确性。

比如,测试用例可以包括输入两个正数、两个负数、一个正数一个负数等情况。

黑盒测试黑盒测试又称为功能测试或行为驱动测试,是一种基于软件需求和规格说明进行测试的方法。

测试人员不需要了解程序的内部工作原理,而是通过输入输出的观察来评估程序的正确性。

继续以上述加法函数的例子,黑盒测试则关注函数的功能是否符合预期需求。

测试人员会编写测试用例,根据输入和输出的关系来验证函数的正确性,而不考虑函数内部的实现细节。

例如,黑盒测试的测试用例可能包括输入两个正数、两个负数、一个正数一个负数等情况,观察输出结果是否符合预期的加法运算结果。

白盒测试和黑盒测试的区别1.测试对象不同:白盒测试关注程序的内部结构和逻辑,而黑盒测试关注程序的功能和用户需求。

2.测试重点不同:白盒测试侧重于路径覆盖和代码执行逻辑,黑盒测试侧重于功能是否符合需求。

3.测试用例设计方法不同:白盒测试需要了解程序内部结构,设计测试用例以覆盖不同路径和边界条件;黑盒测试则通过需求规格设计测试用例,验证程序的功能是否正确。

4.测试人员角色不同:白盒测试需要有编程和代码理解能力的测试人员,而黑盒测试相对更容易上手,适合非技术人员进行测试。

白盒测试例题

白盒测试例题

例题2:应用白盒测试法的具体步骤:1.按照某种覆盖标准,选择一组需要覆盖的路径;2.确定上述路径所需的输入数据;3.计算与输入数据相应的输出。

下面以工资管理程序为例说明白盒测试方法的运用过程。

(白盒测试方法有6种)工资管理程序BONUS的输入数据是职员表(Employee Table)和部门销售表(Department Table)(图1)。

职员表由姓名(Name)、职务(Job)、部门(Dept.)和工资(Salary)四个属性组成。

部门销售表由部门(Dept)和销售量(Sales)组成。

程序的功能是:“为销售量最大的部门中每一个职工增加200元工资,但是,如果某个职员的原有工资已达15000元,或者他的职务是经理,则只给他增加100元。

如果程序能正常地完成,则输出出错码0;如果两表格中没有任何条目,则输出出错码1;如果没有职员在部门销售表中销售量最大的部门中工作,则输出出错码2;”工资管理程序BONUS的两个表如下:工资管理程序BONUS的源程序:参数表中EMPTAB、DEPTTAB分别是职员表和部门表,ESIZE、DSIZE分别是两个表的长度,ERRCODE是出错码。

这里略去了说明部分和注释。

Procedure Bonus(EMPTAB,DEPTTAB:TABLE; ESIZE,DSIZE,ERRCODE:INTEGER);/*最大销量和出错码初始化*/1. Begin MAXSALES:=0; ERRCODE:=0;/*判断表是否为空,空输出1,并退出程序,否则继续执行*/2. IF (ESIZE<=0) or (DSIZE<=0)3. THEN ERRCODE:=1;4. ELSE/*获得最大销量*/5. For i=1 to DSIZE6. If Sales(i)> MAXSALES7. then MAXSALES = Sales(i);/*找到销量最大的每一个部门,并做进一步处理*/8. For j=1 to DSIZE9. If Sales(j)= MAXSALES10. Then11. Begin Found:=False;/*找销量最大的职员所属部门对应的职员表中的职员并处理*/12. For k:=1 to ESIZE13. If (EMPTAB.DEPT(k)= DEPTTAB. DEPT(J))14. Then15. Begin Found:=True;/*如果该职员工资超过15000或职务是经理则加100工资,否则加200工资*/16. If (SALARY(k)>=15000.0) or (JOB(k)=”M”)17. Then18. SALARY(k):= SALARY(k)+100.0;19. Else20. SALARY(k):= SALARY(k)+200.0;21. End;/*如果找不到对应职员,则输出出错码2,否则出错码默认0*/22. If (!Found ) then ERRORCODE:=2;23. End24. End25. End用白盒测试方法设计测试用例。

3-10白盒测试_综合案例分析

3-10白盒测试_综合案例分析
2. 在采用了路径测试的基础上 ,可针对循环,进而 采用循环测试,以验证循环结构的正确性。
拓展训练
请综合考虑使用各 白盒测试方法对下面 的程序代码段进行测 试。
void ReadPara( CString temp) { if ( temp == ">=")
m_oper.SetCurSel(0); else{
案例分析
2. 路径2(1-2-9-11-12)的测试用例:
score[ 1 ]= – 1 ; 期望的结果:average = – 1 ,其他量保持初值。 3. 路径3(1-2-3-9-10-12)的测试用例: 输入多于50个有效分数,即试图处理51个分数,要求前51个为有效 分数; 期望结果:n1=50、且算出正确的总分和平均分。 4. 路径4(1-2-3-4-5-8-2…)的测试用例: score[i]=有效分数,当i<50; score[k]<0, k< i ; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和 平均分average。
} }
return;
谢谢大家!
the
end
ቤተ መጻሕፍቲ ባይዱ
score[i]=有效分数, 当i<50; 期望结果:根据输入的有效分 数算出正确的分数个数n1、总分sum和平均分average。
本路径测试一样满足100%的语句覆盖、条件覆盖和路径覆 盖。
案例小结
1. 由于路径测试一般来说会满足逻辑覆盖的指标,因 此在实际中较多采用,但是路径测试会随着条件节 点的增多而急剧增多,对于环形复杂度>10的程序, 一般会认为过于复杂而难以测试。
案例分析
案例分析
1. V(G)= 6 (个区域) 2. V(G)=E–N+2=16–12+2=6 其中E为流图中的边数,N为结点数; 3. V(G)=P+1=5+1=6 其中P为谓词结点的个数。在流图中,结点2、3、5、6、 9是谓词结点。

白盒测试(语句覆盖、条件覆盖、判断覆盖、路径覆盖)

白盒测试(语句覆盖、条件覆盖、判断覆盖、路径覆盖)

⽩盒测试(语句覆盖、条件覆盖、判断覆盖、路径覆盖)在⽩盒测试中,有四种常见测试⽅法:语句覆盖条件覆盖判断覆盖路径覆盖下⾯我们⽤⼀道例题来解释他们之间的区别:STARTINPUT (A,B,C)IF A>5THEN X= 10ELSE X=1END IFIF B> 10THEN Y=20ELSE Y=2END IFIF C> 15THEN Z= 30ELSE Z=3END IFPRINT (X,Y,Z)STOP该题的程序流程图:1、语句覆盖语句覆盖的含义:选择⾜够多的测试数据,使被测程序中每个语句⾄少执⾏⼀次。

语句覆盖只关⼼判定表达式的值,⽽没有分别测试判定表达式中每个条件取不同值时的情况(即⼀个判断语句的两个分⽀若没有其他语句。

则只需要执⾏⼀个分⽀语句)。

如上图的程序流程图,若想每个语句⾄少执⾏⼀次(赋值语句也是语句),则最少需要两组测试数据。

全部为true:A=20,B=20,C=20全部为false:A=1,B=1,C=12、判断覆盖(分⽀覆盖、判定覆盖)判定覆盖的含义:不仅每个语句必须⾄少执⾏⼀次,⽽且每个判定的每种可能的结果都应该⾄少执⾏⼀次在⑴的基础上,每个判定的每个分⽀⾄少执⾏⼀次如上图的程序流程图。

在(1)的基础上每个分⽀⾄少执⾏⼀次,则可以⽤和(1)⼀样的两组数据。

(该题具有特殊性)全部为true:A=20,B=20,C=20全部为false:A=1,B=1,C=13、条件覆盖条件覆盖的含义:不仅每个语句⾄少执⾏⼀次,⽽且使判定表达式中的每个条件都取到各种可能的结果在⑴的基础上,使每个判定表达式的每个条件都取到各种可能的结果。

通俗来讲就是每个判断条件都可以取到所有的可能。

如上图的程序流程图。

在(1)的基础上使每个判定表达式的每个条件都取到各种可能的结果,则可以⽤和(1)⼀样的两组数据。

(该题具有特殊性)全部为true:A=20,B=20,C=20全部为false:A=1,B=1,C=14、路径覆盖路径覆盖的含义:选取⾜够多测试数据,使程序的每条可能路径都⾄少执⾏⼀次(如果程序图中有环,则要求每个环⾄少经过⼀次)。

白盒测试逻辑覆盖练习题

白盒测试逻辑覆盖练习题

白盒测试逻辑覆盖练习题一、语句覆盖if (a > 0 && b > 0) {c = a + b;} else {c = 0;}def check_age(age):if age < 18:return "未成年"elif age >= 18 and age < 60:return "成年人"else:return "老年人"二、分支覆盖if (x > 0) {if (y > 0) {printf("第一象限");} else {printf("第四象限");}} else {if (y > 0) {printf("第二象限");} else {printf("第三象限");}}function calculateGrade(score) {if (score >= 90) {return 'A';} else if (score >= 80) {return 'B';} else if (score >= 70) {return 'C';} else {return 'D';}}三、路径覆盖public int calculate(int a, int b) { if (a > 0) {if (b > 0) {return a + b;} else {return a b;}} else {if (b > 0) {return b a;} else {return 0;}}}public int Max(int a, int b, int c) { if (a > b) {if (a > c) {return a;} else {return c;}} else {if (b > c) {return b;} else {return c;}}}四、条件覆盖def check_password(password):if len(password) >= 8 and any(char.isdigit() for char in password):return "密码强度高"else:return "密码强度低"function validateForm(username, password) {if (username.length > 0 && password.length > 0) { return true;} else {return false;}}五、判定条件覆盖public boolean isEligible(int age, boolean hasLicense) {if (age >= 18 && hasLicense) {return true;} else {return false;}}int isPrime(int num) {if (num <= 1) {return 0;}for (int i = 2; i < num; i++) {if (num % i == 0) {return 0;}}return 1;}六、多条件覆盖public string GetGrade(int score, bool isFinalExam) { if (score >= 90 || (isFinalExam && score >= 80)) { return "A";} else if (score >= 80 || (isFinalExam && score >= 70)) {return "B";} else if (score >= 70 || (isFinalExam && score >= 60)) {return "C";} else {return "D";}}return "Eligible";} else {return "Not Eligible";}}七、条件组合覆盖def check_login(username, password, is_admin):if (username == "admin" or username == "user") and password == "56" and not is_admin:return "User logged in";elif (username == "admin" and is_admin) and password == "admin123":return "Admin logged in";else:return "Invalid credentials";public String authenticate(String username, String password, boolean hasTwoFactor) {if (username.equals("admin") &&password.equals("admin123") && hasTwoFactor) {return "Admin access granted";} else if (username.equals("user") &&password.equals("user123") && !hasTwoFactor) {return "User access granted";} else {return "Access denied";}}八、路径条件覆盖void processOrder(int quantity, float discount) {if (quantity > 10) {if (discount < 0.1) {printf("Order processed with standard discount");} else {printf("Order processed with special discount");}} else {printf("Order processed without discount");}}function calculateTotal(price, isMember, hasCoupon) { let total = price;if (isMember) {total = 0.9; // 10% discount for members}if (hasCoupon) {total = 0.95; // Additional 5% discount for coupon}return total;}九、修改条件/判定覆盖def upgrade_account(user_type, points):if user_type == "basic" and points >= 100:return "Upgrade to premium"elif user_type == "premium" and points >= 200:return "Upgrade to elite"else:return "No upgrade available"public String checkSubscription(String type, int duration) {if (type.equals("monthly") && duration >= 6) {return "Eligible for annual plan";} else if (type.equals("annual") && duration >= 12) {return "Eligible for lifetime plan";} else {return "Continue current plan";}}答案一、语句覆盖1. 测试用例:a=1, b=1;a=1, b=12. 测试用例:age=15;age=25;age=65二、分支覆盖1. 测试用例:x=1, y=1;x=1, y=1;x=1, y=1;x=1, y=12. 测试用例:score=95;score=85;score=75;score=65三、路径覆盖1. 测试用例:a=1, b=1;a=1, b=1;a=1, b=1;a=1, b=12. 测试用例:a=10, b=5, c=3;a=5, b=10, c=8;a=5, b=5, c=10;a=3, b=3, c=3四、条件覆盖1. 测试用例:password="567";password=""2. 测试用例:username="test", password="pass";username="", password=""五、判定条件覆盖1. 测试用例:age=20, hasLicense=True;age=17, hasLicense=False2. 测试用例:num=2;num=1;num=0;num=1六、多条件覆盖1. 测试用例:score=95, isFinalExam=False;score=85, isFinalExam=True;score=75, isFinalExam=False;score=65, isFinalExam=True七、条件组合覆盖1. 测试用例:username="admin", password="admin123",is_admin=False;username="user", password="56",is_admin=False;username="admin", password="admin123",is_admin=True2. 测试用例:username="admin", password="admin123", hasTwoFactor=True;username="user", password="user123", hasTwoFactor=False;username="admin", password="wrong", hasTwoFactor=True八、路径条件覆盖1. 测试用例:quantity=15, discount=0.05;quantity=8, discount=0.05;quantity=15, discount=0.22. 测试用例:price=100, isMember=True, hasCoupon=True;price=100, isMember=False, hasCoupon=False;price=100, isMember=True, hasCoupon=False九、修改条件/判定覆盖1. 测试用例:user_type="basic", points=50;user_type="basic", points=150;user_type="premium",points=150;user_type="premium", points=2502. 测试用例:type="monthly", duration=3;type="monthly", duration=9;type="annual", duration=9;type="annual", duration=15。

白盒测试覆盖例题

白盒测试覆盖例题

白盒测试覆盖例题白盒测试是软件测试中的一种重要手段,通过对代码内部结构的检查来评估软件的质量。

在白盒测试中,覆盖率是一个重要的指标,它用来衡量测试用例是否充分覆盖了被测代码的各个部分。

在本文中,我们将通过一个例题来探讨白盒测试覆盖问题。

例题描述假设有一个简单的计算器程序,能够实现加、减、乘、除等基本运算。

以下是程序的伪代码:def calculator(operator, num1, num2):if operator =='+':result = num1 + num2elif operator =='-':result = num1 - num2elif operator =='*':result = num1 * num2elif operator =='/':if num2 !=0:result = num1 / num2else:result ='Error: divide by zero'else:result ='Error: invalid operator'return result问题提出针对上述计算器程序,我们将提出以下几个问题,用以讨论在白盒测试中如何进行有效的覆盖:1.设计测试用例,确保覆盖所有的运算符(+、-、*、/)。

2.设计测试用例,验证除法运算中除数为0的情况。

3.设计测试用例,覆盖所有的条件分支路径。

4.如何进行语句覆盖测试?5.如何进行路径覆盖测试?解题思路1.设计测试用例覆盖所有的运算符:–测试用例1:operator=’+’,num1=3,num2=5–测试用例2:operator=’-’,num1=10,num2=2–测试用例3:operator=’*’,num1=4,num2=6–测试用例4:operator=’/’,num1=8,num2=22.验证除法运算中除数为0的情况:–测试用例5:operator=’/’,num1=6,num2=03.覆盖所有的条件分支路径:–测试用例6:operator=’%’(错误的运算符)–测试用例7:operator=’/’,num1=8,num2=04.语句覆盖测试:–通过设计测试用例,使得每个语句至少被执行一次。

【转】白盒测试常见测试用例覆盖方式及用例

【转】白盒测试常见测试用例覆盖方式及用例

【转】⽩盒测试常见测试⽤例覆盖⽅式及⽤例
本流程图描述了某⼦程序的处理流程,现要求⽤⽩盒测试法对⼦程序进⾏测试。

要求:根据⽩盒测试常⽤的以下⼏种⽅式:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、多重条件覆盖(条件组合覆盖)、路径覆盖六种覆盖标准,从供选择的答案中分别找出满⾜相应覆盖标准的最⼩的测
试数据组并简述各种测试⽅法。

测试⽤例:
A: x=3 y=3 z=0;x=1 y=2 z=1
B: x=1 y=2 z=0;x=2 y=1 z=1
C: x=4 y=2 z=0; x=3 y=3 z=0; x=2 y=1 z=0; x=1 y=1 z=1
D: x=4 y=2 z=0; x=1 y=2 z=1; x=2 y=1 z=0; x=1 y=1 z=1
E: x=4 y=2 z=0
F: x=4 y=2 z=0;x=1 y=1 z=1
⽤例分析:
语句覆盖E:语句覆盖是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,被测程序的每个语句⾄少被执⾏⼀次,语句覆盖是⼀种⽐较弱的覆盖标准
判定覆盖A:也称分⽀覆盖,是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,被测程序的每个判定的所有可能结果⾄少出现⼀次
条件覆盖B:是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,判定中的每个条件的所有可能结果⾄少出现⼀次
判定/条件覆盖F:是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,判定中每个条件的所有可能结果⾄出现⼀次,并且每个判定本⾝的所有可能结果也⾄少出现⼀次
多重条件覆盖D:是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,每个判定中条件结果的所有可能组合⾄少出现⼀次
路径覆盖C:是指选择⾜够的测试⽤例,使得运⾏这些测试⽤例时,程序的每条可能执⾏到的路径都⾄少经过⼀次。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

白盒测试实例--1需求说明三角形的问题在很多软件测试的书籍中都出现过,问题虽小,五脏俱全,是个很不错的软件测试的教学例子。

本文借助这个例子结合教学经验,从更高的视角来探讨需求分析、软件设计、软件开发与软件测试之间的关系与作用。

题目:根据下面给出的三角形的需求完成程序并完成测试:一、输入条件:1、条件1:a+b>c2、条件2:a+c>b3、条件3:b+c>a4、条件4:0<a<2005、条件5:0<b<2006、条件6:0<c<2007、条件7:a==b8、条件8:a==c9、条件9:b==c10、条件10:a2+b2==c211、条件11:a2+ c2== b212、条件12:c2+b2== a2二、输出结果:1、不能组成三角形2、等边三角形3、等腰三角形4、直角三角形5、一般三角形6、某些边不满足限制白盒测试实例--2学生的答案在教学的过程中发现,很多学生一看到这个需求,都觉得很简单,然后立刻就开始动手写代码了,这并不是一个很好的习惯。

如果你的第一直觉也是这样的,不妨耐心看到文章的最后。

大部分学生的思路:1、首先建立一个main函数,main函数第一件事是提示用户输入三角形的三边,然后获取用户的输入(假设用户的输入都是整数的情况),用C语言来写,这一步基本上不是问题(printf和scanf),但是要求用java来写的话,很多学生就马上遇到问题了,java5.0及之前的版本不容易获取用户的输入。

点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用图形化界面来做输入,就得全部写过代码。

2、业务处理流程的思路用流程图表示如下:3、C语言代码:1. #include<stdio.h>2. v oid main()3. {4. int a, b, c;5. printf("please enter three integer:");6. scanf("%d%d%d", &a, &b, &c);7. if(0<a && a<200 && 0<b && b<200 && 0<c && c<200)8. {9. if(a+b>c && a+c>b && c+b>a)10. {11. if(a==b && b==c && a==c) //这里可以省掉一个判断12. {13. printf("1是等边三角形");14. }15. else16. {17. if(a==b || b==c || a==c)18. {19. printf("2是等腰三角形");20. }21. else22. {23. if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)24. {25. printf("3是直角三角形");26. }27. else28. {29. printf("4是一般三角形");30. }31. }32. }33. }34. else35. {36. printf("5不能组成三角形");37. }38. }39. else40. {41. printf("6某些边不满足限制");42. }43. }点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用web或图形化界面来做输入,就得全部写过代码。

白盒测试实例--3需求分析需求分析是后续工作的基石,如果分析思路有问题,后续工作可能就会走向不正确的方向,比如:代码重用性差、难于测试、难于扩展和难于维护等。

反而,如果需求分析做的好,对设计、开发和测试来说,都可能是很大的帮助。

看到题目给出的条件达12个之多,粗粗一看,好像很复杂,但仔细分析之后,发现可以把它们分成4组来讨论:1、条件1:a+b>c;条件2:a+c>b;条件3:b+c>a这三个表达式有什么特点呢?实际上它们的逻辑是一样的:两个数之和大于第三个数。

那么,前面程序的写法就存在逻辑重复的地方,应该把这个逻辑提取到一个函数中。

2、条件4:0<a<200;条件5:0<b<200;条件6:0<c<200这三个表达式也是同一个逻辑:判断一个数的范围是否在(0, 200)区间内,也应该把这个逻辑提取到一个函数中,去掉重复的逻辑,提高代码的可重用性。

可重用性的好处:比如,现在用户的需求改为了三条边的取值范围要改为[100,400],那么,按前面的思路来说,需要改3个地方,而现在只需要在一个函数里改1个地方,这就是代码重用的好处。

3、条件7:a==b;条件8:a==c;条件9:b==c这三个表达式的逻辑:判断两个数是否相等。

也应该把它提取到一个函数中。

我们进一步来分析一下判断是否是等边三角形或等腰三角形的条件:(1)前面程序的判断是从最直观的方式(a==b && b==c && a==c)(实际上只需要两个表达式成立即可)三条边都相等来判定是等边三角形;(a==b || b==c || a==c)只有两条边相等来判定是等腰三角形。

(2)转变一下思路:给定三个整数,然后用一个函数来判断这三个整数有几个相等,返回相等的个数,如果返回值等于3,那么它是等边三角形,如果返回值是2,那么它是等腰三角形,否则,它是一般三角形(如果不是直角三角形的话)。

4、条件10:a2+b2==c2 条件11:a2+ c2== b2 条件12:c2+b2== a2这三个条件的处理方式有两种:(1)跟前面三组分析一样,把相同的逻辑提取到一个函数中,然后三次调用。

(2)根据直角三角形的特点:斜边是最长的,所以我们可以事先写一个函数来找到最长的边,然后把它赋值给c,这样处理之后,只需要一次调用判定(a2+b2==c2)的函数了。

白盒测试实例--4程序设计程序设计对于软件的质量和软件实施过程的难易程度起着至关重要的作用。

好的设计,即使聘用没什么经验的开发人员都很容易产生出高质量的代码出来;而差的设计,即使是经验很丰富的开发人员也很容易产生缺陷,特别是可重用性、可测试性、可维护性、可扩展性等方面的缺陷。

经过以上的分析,下面来看一下如何设计。

在下图中,每个方框都使用一个函数来实现,为了跟用户界面分开,最顶上的函数不要写在main函数中。

把思路用流程图的方式表达出来,不用停留在脑袋里:具体的函数的调用关系图:复杂模块triangleType的流程图:白盒测试实例--5编码1、Triangle.h1. /*2. * Copyright (c) 2008, 胡添发(hutianfa@16)3. *4. * 三角形类型判断5. *6. */7.8. #include<stdio.h>9. #include<String.h>10.11. /*12. * 判断一个整数是否在(0, 200)区间内13. * 返回值:true-否; false-是14. */15. bool isOutOfRange(int i);16.17. /*18. * 判断三条边是否合法(即:判断三条边都在合法的范围内)19. * 返回值:true-是; false-否20. */21. bool isLegal(int a, int b, int c);22.23. /*24. * 判断两条边之和是否大于第三边25. * 返回值:true-是; false-否26. */27. bool isSumBiger(int a, int b, int c);28.29. /*30. * 判断三条边是否能够组成三角形31. * 返回值:true-是; false-否32. */33. bool isTriangle(int a, int b, int c);34.35. /*36. * 判断两条边是否相等37. * 返回值:true-是; false-否38. */39. bool isEquals(int a, int b);40.41. /*42. * 求三角形有几条边相等43. * 返回值:相等边的数量44. */45. int howManyEquals(int a, int b, int c);46.47. /*48. * 判断是否满足两边平方之和是否等于第三边的平方49. *50. */51. bool isPowerSumEquals(int a, int b, int c);52.53. /*54. * 判断第一个数是否比第二个数大55. */56. bool isGreaterThan(int a, int b);57.58. /*59. * 判断是否是直角三角形60. *61. */62. bool isRightRriangle(int a, int b, int c);63.64. /*65. * 判断三角形的类型,返回值:66. * 1、不能组成三角形67. * 2、等边三角形68. * 3、等腰三角形69. * 4、直角三角形70. * 5、一般三角形71. * 6、某些边不满足限制72. */73. int triangleType(int a, int b, int c);2、Triangle.cpp1. /*2. * Copyright (c) 2008, 胡添发(hutianfa@16)3. *4. * 三角形类型判断5. *6. */7. #include<stdio.h>8. #include<String.h>9.10. /*11. * 判断一个整数是否在(0, 200)区间内12. * 返回值:true-否; false-是13. */14. bool isOutOfRange(int i)15. {16. if(0<i && i<200)17. {18. return false;19. }20. else21. {22. return true;23. }24. };25.26. /*27. * 判断三条边是否合法(即:判断三条边都在合法的范围内)28. * 返回值:true-是; false-否29. */30. bool isLegal(int a, int b, int c)31. {32. if(isOutOfRange(a) || isOutOfRange(b) || isOutOfRange(c))33. {34. return false;35. }36. return true;37. }38.39. /*40. * 判断两条边之和是否大于第三边41. * 返回值:true-是; false-否43. bool isSumBiger(int a, int b, int c)44. {45. if(a+b > c)46. {47. return true;48. }49. return false;50. }51.52. /*53. * 判断三条边是否能够组成三角形54. * 返回值:true-是; false-否55. */56. bool isTriangle(int a, int b, int c)57. {58. if(isSumBiger(a, b, c) && isSumBiger(a, c, b) && isSumBiger(b, c, a))59. {60. return true;61. }62. return false;63. }64.65. /*66. * 判断两条边是否相等67. * 返回值:true-是; false-否68. */69. bool isEquals(int a, int b)70. {71. if(a==b)72. {73. return true;74. }75. return false;76. }78. /*79. * 求三角形有几条边相等80. * 返回值:相等边的数量81. * 1:没有边相等 2:只有两条边相等 3:三条边相等82. *83. */84. int howManyEquals(int a, int b, int c)85. {86. int count = 1;87. if(isEquals(a,b))88. {89. count++;90. }91. if(isEquals(b,c))92. {93. count++;94. }95. if(isEquals(a,c))96. {97. count++;98. }99. if(count > 3) //如果三条边都相等,则count多加了一次100. {101. count = 3;102. }103.104. return count;105. }106.107. /*108. * 判断是否满足两边平方之和是否等于第三边的平方109. *110. */111. bool isPowerSumEquals(int a, int b, int c)112. {113. if(a*a + b*b == c*c)114. {115. return true;116. }117. return false;118. }119.120. /*121. * 判断第一个数是否比第二个数大122. */123. bool isGreaterThan(int a, int b) 124. {125. if(a>b)126. {127. return true;128. }129. return false;130. }131.132. /*133. * 判断是否是直角三角形134. *135. */136. bool isRightRriangle(int a, int b, int c) 137. {138. int max = 0;139. if(isGreaterThan(a, b))140. {141. max = a;142. a = b;143. b = max;144. }145. if(isGreaterThan(b, c))146. {147. max = b;148. b = c;149. c = max;150. }151. return isPowerSumEquals(a, b, c); 152. }153.154. /*155. * 判断三角形的类型,返回值:156. * 1、不能组成三角形157. * 2、等边三角形158. * 3、等腰三角形159. * 4、直角三角形160. * 5、一般三角形161. * 6、某些边不满足限制162. */163. int triangleType(int a, int b, int c)164. {165. int type=0;166. if(isLegal(a, b, c))167. {168. if(isTriangle(a, b, c))169. {170. int num = howManyEquals(a, b, c); 171. if(3==num)172. {173. type=2;174. }175. else if(2==num)176. {177. type=3;178. }179. else if(isRightRriangle(a, b, c)) 180. {181. type=4;182. }183. else184. {185. type=5;186. }187. }188. else189. {190. type=1;191. }192. }193. else194. {195. type=6;196. }197. return type;198. }白盒测试实例--6单元测试的步骤白盒测试与黑盒测试的过程和方法是有一些区别的。

相关文档
最新文档