软件工程第二次作业
一、开发工具选择
因本人选择 C++
语言进行开发,而且本机已经安装了宇宙最强IDE的较新的版本Visual Studio 2017
。所以我选择以Visual Studio 2017 作为开发工具。IDE运行后界面截图如下。
二、单元测试
通过单元测试,开发人员和测试人员可以快速查找项目中各个类的方法中的逻辑错误。使用单元测试能够有效提高个人或团队的代码质量,所以学会使用单元测试算得上是程序员的基本技能。 要想在Visual Studio中使用单元测试,首先得建立一个用于测试项目文件。
1 在 Visual Studio 建立C++项目
这里我用一个简单的例子来作为演示。
【问题描述】输入某年某月某日,判断这一天是这一年的第几天。
【输入形式】输入三个正整数
【输出形式】输出这一天是这一年的第几天
【样例输入】2010 3 4
【样例输出】63
【样例输入】2008 5 6
【样例输出】127
1.1 新建项目
打开IDE,选择菜单中的“文件”节点,然后选择“新建” > “项目”。 然后在左窗格中选择“Visual C++ ”,并在中心窗格中选择“Windows 控制台应用程序”,随后修改项目名称,点击确定即可。也可以使用快捷键Ctrl + Shift + N
快速新建项目。
1.2 编写代码
在项目名称.h
和项目名称.cpp
文件中编写所需代码,在此例子中我编写的代码如下:
//WhichDay.h
#pragma once
#include "pch.h"
int solve(int year, int month, int day);
int solve(int year, int month, int day) {
int monthDay[] = { 31, 28, 31, 30,
31, 30, 31, 31,
30, 31, 30, 31 };
int whichDays = 0;
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
monthDay[1] = 29;
for (int i = 0; i < month - 1; i++)
whichDays += monthDay[i];
whichDays += day;
return whichDays;
}
//WhichDay.cpp
#include "pch.h"
#include <iostream>
#include "WhichDay.h"
int main()
{
int year, month, day;
std::cin >> year >> month >> day;
int whichDays
whichDays = solve(year, month, day);
std::cout << whichDays << std::endl;
return 0;
}
编写完代码后,可直接在IDE中运行和调试程序,若要对程序进行单元测试则还需编写单元测试的代码和配置引用等项目。
2 在 Visual Studio 中编写 C/C++ 单元测试
如何使用Visual Studio 2017对C++进行单元测试可以查看微软Visual Studio文档在 Visual Studio 中编写 C/C++ 单元测试。
Visual Studio中提供了丰富的测试框架,其中包含这些 C++ 测试框架,无需进行额外下载:
适用于 C++ 的 Microsoft 单元测试框架
Google Test
Boost.Test
CTest
除了这些已安装的框架,还可以在 Visual Studio 中使用任何框架编写自己的适配器。我此次使用使用适用于 C++ 的 Microsoft 单元测试框架。
下文是使用适用于 C++ 的 Microsoft 单元测试框对 C++ 进行单元测试的基本流程和配置。
2.1 创建测试项目
首先右键单击解决方案资源管理器中的“解决方案”节点,然后选择“添加” > “新建项目”。 然后在左窗格中选择“Visual C++ 测试”,并在中心窗格中选择“本机单元测试”。 下图显示了新建测试项目的过程:
2.2 创建对解决方案中的其他项目的引用
为了使测试代码可以访问要测试的项目中的函数,我们必须要在测试项目中添加对要测试项目的引用。在测试项目的“引用”节点右键选择“添加” > “引用”。然后在对话框中选中要测试的项目。
2.3 为头文件添加 #include 指令
对要测试项目添加引用之后,需要在单元测试.cpp
文件中为声明要测试的类型和函数的所有头文件添加#include
指令。在 Visual Studio 中输入#include "
, Visual Studio 的 IntelliSense 会激活帮助选择头文件,十分方便。
2.4 编写测试方法
在测试项目中的 .cpp 文件中编写单元测试的有关代码。在文件中每一个 TEST_METHOD 方法中都是一个测试。TEST_METHOD 返回 void。 若要生成测试结果,可使用Assert(断言) 类
中的静态方法针对预期结果测试实际结果。编写的测试代码如下:
TEST_METHOD(TestA)
{
int year, month, day;
year = 2008; month = 5; day = 6;
int actual = 127;
Assert::AreEqual(solve(year, month, day), actual);
}
TEST_METHOD(TestB)
{
int year, month, day;
year = 2010; month = 3; day = 4;
int actual = 63;
Assert::AreEqual(solve(year, month, day), actual);
}
TEST_METHOD(TestC)
{
int year, month, day;
year = 2008; month = 5; day = 6;
int actual = 28;
Assert::AreEqual(solve(year, month, day), actual);
}
TEST_METHOD(TestD)
{
int year, month, day;
year = 2010; month = 3; day = 4;
int actual = 19;
Assert::AreEqual(solve(year, month, day), actual);
}
在上面的代码中,Assert::AreEqual
调用的结果可确定测试是通过还是失败。
常规的断言有如下几类:
Assert::AreEqual()
不相等 Assert::AreNotEqual()
相同 Assert::AreSame()
不相同 Assert::AreNotSame()
为 NULL Assert::IsNULL()
不为 NULL Assert::IsNotNULL()
为 True Assert::IsTrue()
为 False Assert::IsFalse()
失败 Assert::Fail()
Assert 类包含用于比较预期结果与实际结果的许多其他方法,详细的用法介绍可以参考微软 Visual Studio 文档Microsoft.VisualStudio.TestTools.CppUnitTestFramework API 参考
2.5 运行测试
1. 在“测试”菜单中,依次选择“窗口” > “测试资源管理器”。
2. 在“解决方案资源管理器”中右键单击其节点并选择“生成”或“重新生成”,来生成测试项目。
3. 在测试资源管理器中,选择“全部运行”,或选择要运行的特定测试。 运行所有测试之后,窗口会显示哪些测试通过和哪些测试失败。对于失败的测试,该消息会提供有助于诊断原因的详细信息。 可以在失败的测试上右键单击并选择“调试选定的测试”以单步执行发生失败的函数。:
至此,一次简单的单元测试演示就完成了。