软件工程(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中如何进行单元测试。知道了每个测视里最好只放一个测试样例,这样方便解决问题。还了解到,在写项目的过程中要及时进行测试,不然在之后项目变大后出现问题不好找到问题所在。通过几个小例子的尝试,理解了工作原理,相信在之后的项目中可以成功地运用,并希望在之后的项目中可以学到更多的知识。

posted on 2019-04-12 20:49  郭田恬  阅读(265)  评论(0)    收藏  举报