软件工程(2019)第二次作业
1. 选择开发工具
使用C++语言开发,选用Visual Studio 2017。由于我的电脑已经安装了此开发工具,这里就只给大家展示一下此开发工具运行后的截图。
2. 练习自动单元测试技术
- 编写需要被测试的代码
创建了一个C++类(Class Calculate),具体代码如下:
#pragma once
class Calculate
{
public:
Calculate();
~Calculate();
int add(int a, int b)//加法运算
{
return a + b;
}
int sub(int a, int b)//减法运算
{
return a - b;
}
int mul(int a, int b)//乘法运算
{
return a * b;
}
int div(int a, int b)//除法运算
{
return a / b;
}
};
- 创建新的单元测试
(1)生成解决方案并成功后,右键点击“解决方案”之后选择添加新建项目,在此工程下创建本机单元测试项目。

(2)创建完毕后,在右侧的状态栏中找到“UnitTest1”,右键点击“引用”之后选择添加引用。

(3)接下来勾选需要测试的项目(本例中即“Project1”)。

(4)右键点击“UnitTest1”,选择属性。之后点击“连接器”->“输入”->“选择依赖项”。填写需要测试项目的obj文件的路径。

- 编写测试程序
#include "stdafx.h"
#include "CppUnitTest.h"
#include"..\Project1\Calculate.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(20, c.add(12, 8));
Assert::AreEqual(-8, c.sub(2, 10));
Assert::AreEqual(10, c.mul(2, 5));
Assert::AreEqual(5, c.div(10, 2));
}
};
}
现在可以运行单元测试了,点击测试选择运行,之后选择所有测试,运行结果如下:

由上图可以看出,上面的四个基本用例均通过了检测。但是我们可以看出,测试里并没有检测除数为零的情况,此情况我们规定应输出“0”表示错误。所以接下来我们来检测一下除数为零的情况。具体测试代码如下:
#include "stdafx.h"
#include "CppUnitTest.h"
#include"..\Project1\Calculate.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(20, c.add(12, 8));
Assert::AreEqual(-8, c.sub(2, 10));
Assert::AreEqual(10, c.mul(2, 5));
Assert::AreEqual(0, c.div(10, 0));
}
};
测试结果如下图:

由上图可以看出,我们可以看出测试出现了错误。但是并不可以看出是那个测试用例出现了错误,此时我们就需要将这四个样例分成四个测试来写,这样比放在一个测试里更能直观反映问题出现在哪里。此时测试代码为:
#include "stdafx.h"
#include "CppUnitTest.h"
#include"..\Project1\Calculate.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(20, c.add(12, 8));
}
TEST_METHOD(TestMethod2)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(-8, c.sub(2, 10));
}
TEST_METHOD(TestMethod3)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(10, c.mul(2, 5));
}
TEST_METHOD(TestMethod4)
{
// TODO: 在此输入测试代码
Calculate c;
Assert::AreEqual(0, c.div(10, 0));
}
};
}
测试结果如下图:

由上图我们可以明显看出是第四个测试出现了问题。除数为零时,输出结果错误。所以此时需要对源代码进行更改。更改后代码如下:
#pragma once
class Calculate
{
public:
Calculate();
~Calculate();
int add(int a, int b)//加法运算
{
return a + b;
}
int sub(int a, int b)//减法运算
{
return a - b;
}
int mul(int a, int b)//乘法运算
{
return a * b;
}
int div(int a, int b)//除法运算
{
if (b != 0)
return a / b;
else
return 0;
}
};
此时再对上述四个测试进行测试,测试结果如下:

由测试结果可以看出,修改后的代码成功通过了测试。
- 常用的Assert用法
Assert.Inconclusive() 表示一个未验证的测试;
Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;
AreSame() 用于验证指定的两个对象变量是指向相同的对象,否则认为是错误;
AreNotSame() 用于验证指定的两个对象变量是指向不同的对象,否则认为是错误;
Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;
Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;
Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;
Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过。
参考来源:https://blog.csdn.net/u013299585/article/details/73662526
3. 总结
经过这次作业,我了解了在vs2017中如何进行单元测试。知道了每个测视里最好只放一个测试样例,这样方便解决问题。还了解到,在写项目的过程中要及时进行测试,不然在之后项目变大后出现问题不好找到问题所在。通过几个小例子的尝试,理解了工作原理,相信在之后的项目中可以成功地运用,并希望在之后的项目中可以学到更多的知识。
浙公网安备 33010602011771号