软件测试 第四次作业
用C语言编写和修改程序
#include
#include
float max(float x,float y){
float z;
z=x>y?x:y;
return(z);
}
int main(){
float a,b,c;
scanf("%f%f",&a,&b);
c=max(a,b);
printf("Max: %f\n",c);
}
案例分析:
案例实现的功能:在主函数里输入两个单精度的数a和b,然后调用max子函数来求a和b,然后调用a和b的较大数,最后输出最大数。
缺陷:
1.程序编写过程中缺少重要的注释部分。
注释包括作者、版本号、创建日期、代码注释等,以及主要功能模块的含义。
2.函数的参数和返回值没有
3.低层次语句比高层次的缩进一个TAB
4.函数和函数之间,定义语句和执行语句之间加空格。
程序修改如下:
#include
/**
* @details 返回两数最大值
* @author junecai
* @date 2023.11
*/
float max(float x, float y)
{
float z;
z = x > y ? x : y;
return z;
}
int main()
{
float a, b, c;
scanf("%f%f", &a, &b);
c = max(a, b);
printf("Max: %f\n", c);
}
程序运行结果
用C语言写一个正立实心的等腰三角形,进行分析
#include
int main()
{
int a;
printf("请输入行数:");
scanf("%d",&a);
for (int i = 1; i <= a; i++)
{
for (int j = 1; i <= a-i; j++)
{
printf(" ");
}
printf("\n");
}
return 0;
}
案例分析:
案例实现的功能:程序运行后,出现一个正立实心的等腰三角形,需要用户输入整形的数字,对应相应的指令,生成一个等腰三角形。
缺陷:
1.程序编写过程中缺少重要的注释部分。
注释包括作者、版本号、创建日期、代码注释等,以及主要功能模块的含义。
2.该段代码,缺少一个“for”的循环体
for(int k=1;k<=2*i-1;i++)
{
print(“*”);
}
实现循环,否则原来的程序继续运行结果会报错。
程序修改如下:
#include
/**
* @details 打印输入行数的三角形
* @author junecai
* @date 2023.11
*/
int main()
{
int a;
printf("请输入行数:");
scanf("%d",&a);
for (int i = 1; i <= a; i++)
{
// 打印空格
for (int j = 1; i <= a-i; j++)
{
printf(" ");
}
// 打印星号
for (int k = 1; i <= 2*i-1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
程序运行结果
用c语言写一个九九乘法表
#include
int main()
{
int i, j;
for (i = 0; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%dx%d=%d\t", i, j, j * i);
}
}
return 0;
}
案例分析:
这段编码实现的功能:运行后可以实现一个九九乘法口诀表图示
1.程序编写中缺少注释
注释是程序中非常重要的组成部分,注释包含作者、版本号、创建日期等。以及主要功能模块的含义。
2.程序运行时出错
a)程序中出现语法错误第四行中i的初始值应该是1而不是0;
b)缺少一个print的值
c)一行代码和自定义一个变量
d)程序适当接一些空行,使程序更加的清晰明了
程序修改如下:
#include
/**
* @details 控制台打印99乘法表
* @author junecai
* @date 2023.11
*/
int main()
{
int i;
int j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%dx%d=%d\t", j, i, j * i);
}
printf("\n");
}
return 0;
}
程序运行结果
自顶向下的集成策略
自底向上集成方式从程序模块结构中最低层的模块开始组装和测试。
底层组件较早被验证,可以尽早发现和修复问题,减少后期修复的成本。
可以并行集成,提高效率。
减少了桩的工作量,因为桩通常是用来模拟底层组件的。
支持故障隔离,即一旦出现错误,可以迅速定位到问题组件。
自顶向下
自顶向上的集成策略-深度优先
自顶向上的集成策略-深度优先
自顶向上的集成策略-广度优先
自顶向上的集成策略-广度优先
各种测试类型的比较
软件测试种类 | 测试对象 | 测试依据 | 人员 | 测试方法 | 特点 | 适用场景 |
单元测试 | 单个模块 | 源代码 | 开发人员 | 白盒测试 | 针对小范围代码 进行测试,发现 模块内部错误 | 开发过程中,用于验证 单个模块的功能 |
集成测试 | 模块集成 | 已测试的模块 | 开发人员 或测试人员 | 灰盒测试 黑盒测试 | 模块之间的接口, 数据传输测试 | 开发完成后,用于验证 模块之间的协调工作 |
系统测试 | 整个系统 | 需求规格 设计文档 | 测试人员 | 黑盒测试 | 验证系统的 功能和性能 是否满足需求 | 用于验证系统 是否符合用户请求 |
确认测试 | 整个系统 | 需求规格 | 测试人员 | 黑盒测试 | 验证系统的 功能和性能 是否满足需求 | 用于验证系统 是否符合用户请求 |
性能测试 | 系统性能 | 需求规格 设计文档 | 测试人员 | 白盒测试 黑盒测试 | 测量系统 的响应时间, 负载能力等 | 用于评估系统的性能 和可拓展性 |
安全测试 | 系统安全 | 安全需求 设计文档 | 安全测试人员 | 白盒测试 黑盒测试 | 测试系统的漏洞 和安全隐患 | 用于验证系统的安全性和防护能力 |
用户验收测 | 用户需求 | 用户需求文档 | 用户或测 试人员 | 黑盒测试 | 验证系统是否满 足用户需求 | 用户认阶系段 用于确交系统是否可交付 |
回归测试 | 已测试的 功能 | 需求规格 设计文档 | 测试人员 | 黑盒测试 | 确保新的修改不 会影响已有功能 | 系统新的变证有更新时、 用于验证已有功能是否正常 |
P45案例
描述:
公司A承担业主B的办公自动化系统的建设工作。2016年10月初,项目正处于开发阶段,预计2017年5月能够完成全部开发工作,但是合同规定2016年10月底进行系统验收。因此,2016年10月初,公司A依据合同规定向业主B和监理方提出在2016年10月底进行验收测试的请求,并提出了详细的测试计划和测试方案。在该方案中指出,测试小组由公司A的测试工程师、外聘测试专家、外聘行业专家及监理方的代表组成。公司的做法是否正确,请给出理由。
案例分析:
从验收的时间来分析公司A的做法是否正确。验收测试是否通过主要应该依据需求规格说明的各项要求是否符合用户需求来决定。验收测试人员既要包括开发方,也需要用户方的参与。
案例实现:
- 不正确;
- 验收测试要在系统测试通过后,交付使用之前进行,而不能仅仅根据合同规定进行,2016年10月底并不具备验收测试的条件;
- 验收测试不能缺少用户方的人员。
拓展案例
上述案例的单元测试、集成测试和系统测试的内容分别是什么?
单元测试:
单元测试是对软件中的最小可测试单元进行检查和验证。对于办公自动化系统来说,这可能包括对各个模块或功能进行测试,如文件管理、电子邮件、日历、通信等。单元测试通常由开发人员或测试工程师进行,主要目的是确保每个模块或功能能够正确运行,并且满足设计要求。
集成测试:
集成测试是在单元测试的基础上,将所有模块或功能集成在一起进行测试。主要目的是检查各个模块之间的交互和通信,以及确保它们能够协同工作。集成测试通常需要模拟各种使用场景,例如同时使用多个功能、处理大量数据等,以检查系统在各种情况下的稳定性和性能。
系统测试:
系统测试是对整个系统进行全面的测试,以确保系统的所有方面都能够正常工作。这包括但不限于功能测试、性能测试、安全测试和用户界面测试。系统测试通常由独立的测试团队或外部机构进行,以确保系统的质量和稳定性达到预期水平。
P47案例
用户输入三角形的三条边a,b,c后,系统会将三角形的类别返回给用户,如三边分别输入3,4,5,并单击“查询”按钮,会显示“直角三角形”,
黑盒测试:
1.黑盒测试
不查看代码,仅通过程序运行、数据输人和输出,测试软件是否符合需求说明。
(1)逻辑功能是否正确
在这个问题中,就是测试三角形类别的判断结果是否正确。用户输人三角形的三边,看系统是否能够正确判断三角形的类别,如无法构成三角形、等腰三角形、直角三角形、钝角三角形和锐角三角形等。
(2) 界面测试
测试用户界面的功能模块的布局是否合理、整体风格是否一致、各个控件的放置位置是否符合用户使用习惯。此外,还要测试界面操作便捷性,导航简单易懂性,页面元素的可用性,界面中文字是否正确,命名是否统一,页面是否美观,文字、图片组合是否完美等。
2.白盒测试
可以查看源代码,检验程序中的每条通路是否都能按预定要求正确工作,并设计相关测试用例,动态执行,对比预期结果与实际结果是否相符。
该程序的主要代码段如下所示:
import java.util.Scanner;
public class TriangleClassifier {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入三角形的三条边(以逗号分隔):");
String input = scanner.nextLine();
String[] sides = input.split(",");
int a = Integer.parseInt(sides[0]);
int b = Integer.parseInt(sides[1]);
int c = Integer.parseInt(sides[2]);
String triangleType = classifyTriangle(a, b, c);
System.out.println("三角形类型:" + triangleType);
}
public static String classifyTriangle(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0) {
return "非法输入,边长必须大于0";
}
if (a + b <= c || a + c <= b || b + c <= a) {
return "无法构成三角形";
}
if (a == b && b == c) {
return "等边三角形";
} else if (a == b || a == c || b == c) {
return "等腰三角形";
} else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
return "直角三角形";
} else {
return "普通三角形";
}
}
}
此代码的功能是读取用户输入的三角形两条边长,并根据输入的边长来判断三角形的类型。如果三条边长无法构成三角形,则输出“无法构成三角形”。如果三条边长相等,则输出“等边三角形”。如果有两条边长相等,则输出“等腰三角形”。如果其中一条边的平方等于其他两条边的平方和,则输出“直角三角形”。否则,输出“普通三角形”。
案例实现:
黑盒测试:
输入数据3、4、5时,得到的应该是“钝角三角形”,但是系统却显示“锐角三角形”
运行结果
当什么都不输入的时候,系统无对用户相应的提示信息
1.界面中a、b、c描述的不清楚,用户使用不方便。
2.回车键在程序中无法使用。
白盒测试:
审阅代码,不难发现代码都没有写上相关的注释,部分和一般企业的代码规范。另外,分析分支发现有逻辑错误,即事先程序没有送出三角形中最大的边,因此才无法得到正确的结果。
拓展案例
网站的注册界面,有以下的需求:
- 用户3-5的个字符
- 密码为6-16个字符
- 填写正确的信息后,单击“注册”按钮可以成功注册新用户。
请根据需求编写至少5条测试用例。
注册页面:
注册页面
测试项目:个人博客注册页 | ||||
项目目的: | 测试注册页安全,逻辑,性能 | 版本: | v1.0 | |
测试环境: | firefox,win10 | |||
编制人 | junecai | 编制时间 | 2023/11/7 | |
用例描述: | 基于数据的测试用例 | |||
预置条件: | 有效的邮箱*1 | |||
参考信息: | 无 | 测试方法: | 黑盒测试 | |
用例编号 | 测试步骤 | 输入数据 | 预期结果 | 测试结果 |
Blog_Reg_01 | 1.输入框全部输入“abc” | abc*4 | 提示信息有误 | “注册失败! 请再仔细检查一些内容喔~” |
Blog_Reg_02 | 1.输入框除邮箱外全部输入“abc” | abc*4 | 验证码获取成功 | “注册成功” |
Blog_Reg_03 | 1.输入用户名"abc" | 用户名:abc | 注册失败 | 注册失败,验证码发送失败 |
Blog_Reg_04 | 1.输入用户名"abc" | 用户名:abc | 注册失败 | 注册失败 |
Blog_Reg_05 | 1.输入用户名"abc" | 用户名:abc | 注册成功 | 注册成功 |
Tips:
author:@软件测试账号
teacher:@华敏IT教育
date:2023/11/7