软件工程第二次作业
(一)选择开发工具
因为之前学过VS的一些操作,所以选择用visual studio 2017作为开发环境,使用我比较熟悉的C++语言:
(二)功能项目
我实现了一个交换两个变量的功能,并以此作为被测试的项目,这个项目的代码如下:
void swap(int &a, int &b)
{
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
这个程序利用异或的运算性质对两个变量进行交换,预期下程序若正常运行,则结果a
应当为传入前b
的值。
(三)本机单元测试
在vs2017中添加一个“本机单元测试项目”:
由于上面的项目就是我要测试的项目,因此将该项目引用到这个测试项目中,并将这个项目的实现结果引入到这个项目中:
准备工作完成后,开始对上面的功能项目进行单元测试,编写如下的单元测试代码:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "..\Project1\swap.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestDiff)
{
int a = -3, b = 5;
swap(a, b);
Assert::AreEqual(a, 5);
Assert::AreEqual(b, -3);
}
TEST_METHOD(TestSameVal)
{
int a = 6, b = 6;
swap(a, b);
Assert::AreEqual(a, 6);
Assert::AreEqual(b, 6);
}
TEST_METHOD(TestSameRef)
{
int a = -5;
swap(a, a);
Assert::AreEqual(a, -5);
}
};
}
测试结果
这里分成三个测试环节,第一个环节测试当a
和b
不相等的时候交换结果是否正确(TestDiff
),第二个环节测试a
和b
相等的时候交换是否正确(TestSameVal
),第三个环节测试a
与自身交换之后结果是否正确(TestSameRef
)。
开始运行测试,得到测试结果:
发现在TestSameRef
测试环节中发生错误。
通过调试和分析算法后发现,功能项目中使用的异或算法针对于被交换两者为同一对象的情况下会失效,这是因为a^a
结果为0,这直接导致a
退化为0而无法继续进行异或运算来交换。
修正与回归测试
考虑到若a==b
的时候实际上也可以不做交换(因为两个变量的值相同,交换前后是一样的),因此改写上述项目程序:
void swap(int &a, int &b)
{
if (a == b)
return;
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
之后进行回归测试,得到结果正确: