实验五 单元检测

     实验五、单元测试

一、实验目的

1)掌握单元测试的方法

2) 学习XUnit测试原理及框架;

3)掌握使用测试框架进行单元测试的方法和过程。

 

二、实验内容与要求

1、了解单元测试的原理与框架

 1.1 单元测试原理

  单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

单元测试的内容包括

  模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试

(1)模块接口测试

模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。模块接口测试也是集成测试的重点,这里进行的测试主要是为后面打好基础。测试接口正确与否应该考虑下列因素: 

    -输入的实际参数与形式参数的个数是否相同 

    -输入的实际参数与形式参数的属性是否匹配 

    -输入的实际参数与形式参数的量纲是否一致 

    -调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同; 

    -调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配; 

    -调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致; 

    -调用预定义函数时所用参数的个数、属性和次序是否正确; 

    -是否存在与当前入口点无关的参数引用; 

    -是否修改了只读型参数; 

    -对全程变量的定义各模块是否一致; 

    -是否把某些约束作为参数传递。

如果模块功能包括外部输入输出,还应该考虑下列因素: 

-文件属性是否正确; 

-OPEN/CLOSE语句是否正确; 

-格式说明与输入输出语句是否匹配; 

-缓冲区大小与记录长度是否匹配; 

-文件使用前是否已经打开; 

-是否处理了文件尾; 

-是否处理了输入/输出错误; 

-输出信息中是否有文字性错误。 

-局部数据结构测试; 

-边界条件测试; 

-模块中所有独立执行通路测试;

(2)局部数据结构测试

    检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确,局部功能是整个功能运行的基础。重点是一些函数是否正确执行,内部是否运行正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误: 

-不合适或不相容的类型说明; 

-变量无初值; 

-变量初始化或省缺值有错; 

-不正确的变量名(拼错或不正确地截断); 

-出现上溢、下溢和地址异常。

(3)边界条件测试

    边界条件测试是单元测试中最重要的一项任务。众所周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。边界条件测试是一项基础测试,也是后面系统测试中的功能测试的重点,边界测试执行的较好,可以大大提高程序健壮性。

(4)独立路径测试

    在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。测试目的主要是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。具体做法就是程序员逐条调试语句。常见的错误包括: 

-误解或用错了算符优先级; 

-混合类型运算; 

-变量初值错; 

-精度不够; 

-表达式符号错。

(5)错误处理测试

   检查模块的错误处理功能是否包含有错误或缺陷。例如,是否拒绝不合理的输入;出错的描述是否难以理解、是否对错误定位有误、是否出错原因报告有误、是否对错误条件的处理不正确;在对错误处理之前错误条件是否已经引起系统的干预等。

     通常单元测试在编码阶段进行。在源程序代码编制完成,经过评审和验证,确认没有语法错误之后,就开始进行单元测试的测试用例设计。利用设计文档,设计可以验证程序功能、找出程序错误的多个测试用例。对于每一组输入,应有预期的正确结果。 

 三:实验步骤截图

1:在eclipse中找到Project中的Properties

 

2:选择Junit,并添加

 

3:选择Junit Test Case并且apply

 

 

 

4:编写代码并检测 

 

 

 

 

5:提交到git里面

 

 思考题:

比较以下二个工匠的做法,你认为哪种好?结合编码和单元测试,谈谈你的认识。

 

 答:我觉得第一种好,因为从下往上都是严格按照一个标准来做,最后做出来的墙(产品)都会很好;如果刚开始没有标准的做,即便后面进行了修正,也会使墙不稳,是产品质量大大下降。

实验小结:

这次试验要用到eclipse,刚好之前的学习中用到过这个。但是我打开之后连普通的代码都运行不了。原来是我最近也用过Myeclipse导致两个有点冲突。后来我把eclipse重新分配了一个工作空间就可以了。这次试验不是很难只要根据学习通上面的指导来很快就解决了。

测试代码:(附页)

package zgh;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class Zgh2Test {

@BeforeEach
void setUp() throws Exception {
}

@Test
void test() {
fail("Not yet implemented");
}

}
/////////////////////////////////////////
//
//开发者:
//
//简介:实现四则运算的简易计算器
//
////////////////////////////////////////
/*
*用swing图形用户界面实现计算器的设计
*同时练习在线文档注释的使用方法
*
* @author linruier
* @version 1.0
* @since J2SE1.8
*/
import javax.swing.JButton;
import java.awt.Graphics;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class computer extends JFrame {
computer() {
super("简易计算器");
Font f = new Font("黑体", 30, 30);
JTextField jt1 = new JTextField(null);
JTextField jt2 = new JTextField(null);
jt1.setFont(f);
jt2.setFont(f);
jt1.setHorizontalAlignment(JTextField.RIGHT);
jt2.setHorizontalAlignment(JTextField.RIGHT);
Container c = getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
c.add(jt1);
c.add(jt2);
jt1.setPreferredSize(new Dimension(370, 70));
jt2.setPreferredSize(new Dimension(370, 75));
jt1.setEditable(false);
jt2.setEditable(false);
JButton jb[] = new JButton[16];
for (int j = 0; j < 16; j++) {
jb[j] = new JButton();
jb[j].setBackground(Color.WHITE);
jb[j].setFocusable(false);
jb[j].setPreferredSize(new Dimension(90, 90));
jb[j].setFont(f);
c.add(jb[j]);
}
this.setResizable(false);
//对各个按钮的名称赋值
jb[0].setText("+");
jb[1].setText("-");
jb[2].setText("*");
jb[3].setText("/");
jb[4].setText("1");
jb[5].setText("2");
jb[6].setText("3");
jb[7].setText("C");
jb[7].setBackground(Color.ORANGE);
jb[8].setText("4");
jb[9].setText("5");
jb[10].setText("6");
jb[11].setText("0");
jb[12].setText("7");
jb[13].setText("8");
jb[14].setText("9");
jb[15].setText("=");

JButton Button_num[] = {
jb[4],
jb[5],
jb[6],
jb[8],
jb[9],
jb[10],
jb[11],
jb[12],
jb[13],
jb[14]
};
for (int i = 0; i < Button_num.length; i++) {
Button_num[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton action_Button = (JButton) e.getSource();
jt2.setText(jt2.getText() + action_Button.getText());
}
});
}
for (int j = 0; j < 4; j++) {
jb[j].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s = jt2.getText();
char ch = s.charAt(s.length() - 1);

if (ch == '+' || ch == '-' || ch == '*' || ch == '/')((JButton) e.getSource()).setEnabled(false);
else {
jt1.setText(jt2.getText());
jt2.setText(((JButton) e.getSource()).getText());
}

}
});
}
jb[7].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jt1.setText(null);
jt2.setText(null);
}
}

);
jb[15].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String Calculate_String = jt1.getText() + jt2.getText();
int result = calculation.result(Calculate_String);
jt1.setText(null);
jt2.setText(Integer.toString(result));
} catch(ArithmeticException ex) {
jt1.setText(null);
jt2.setText("ERROR");
}
}
});
}
public static void main(String args[]) {
computer app = new computer();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(400, 580);
app.setVisible(true);
}
}

//再定义一个计算类calculation.java:
public class calculation {
calculation() {};
boolean is_operator(char ch) {
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') return true;
else return false;
}
static int result(String s) {
String ch[] = {
"+",
"-",
"*",
"/"
};
int i = 0;
int index;
while (s.indexOf(ch[i]) == -1 && i < 4) {
i++;
}
if (i == 4) return - 1;
else index = s.indexOf(ch[i]);
String s1 = s.substring(0, index);
String s2 = s.substring(index + 1, s.length());
if (i == 0) return Integer.parseInt(s1) + Integer.parseInt(s2);
if (i == 1) return Integer.parseInt(s1) - Integer.parseInt(s2);
if (i == 2) return Integer.parseInt(s1) * Integer.parseInt(s2);
if (i == 3 && Integer.parseInt(s2) != 0) return Integer.parseInt(s1) / Integer.parseInt(s2);
else if (i == 3 && Integer.parseInt(s2) == 0) {
throw new ArithmeticException();
}
return - 1;
}

}

 

posted @ 2020-06-03 23:09  周光宏  阅读(193)  评论(0编辑  收藏  举报