彩票走势图

Visual Studio 使用教程:如何编写C ++ DLL的单元测试(下)

翻译|使用教程|编辑:况鱼杰|2020-04-02 15:33:21.040|阅读 377 次

概述:本演练介绍如何使用测试优先方法开发本机C ++ DLL。本教程内容比较多,分为两部分进行,此为下部分。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

Visual Studio是功能完备的 IDE,可用于编码、调试、测试和部署到任何平台,Visual Studio使用 .NET 开发 iOS、Android 和 Web 应用和游戏。

点击立即下载Visual Studio


本演练介绍如何使用测试优先方法开发本机C ++ DLL。本教程内容比较多,分为两部分进行,此为下部分(点击此处到底上部分内容)。

反复扩大测试并使它们通过

  • 添加一个新测试:

TEST_METHOD(RangeTest)
{
  CRootFinder rooter;
  for (double v = 1e-6; v < 1e6; v = v * 3.2) { double actual = rooter.SquareRoot(v*v); Assert::AreEqual(v, actual, v/1000); } }
注意:建议您不要更改已通过的测试。而是添加一个新测试,更新代码以使该测试通过,然后添加另一个测试,依此类推。
当用户更改要求时,请禁用不再正确的测试。编写新的测试,并使它们一次以相同的增量方式工作。
  • 生成解决方案,然后在“测试资源管理器”中,选择“全部运行”。新测试失败。

The RangeTest fails

提示:编写每个测试后,请验证每个测试均立即失败。这可以帮助您避免编写永远不会失败的测试的简单错误。

增强您的DLL代码,以便新测试通过:

#include 
...
double CRootFinder::SquareRoot(double v)
{
  double result = v;
  double diff = v;
  while (diff > result/1000)
  {
    double oldResult = result;
    result = result - (result*result - v)/(2*result);
    diff = abs (oldResult - result);
  }
  return result;
}
  • 生成解决方案,然后在“测试资源管理器”中,选择“全部运行”。两项测试均通过。

Unit Test Explorer - Range Test passed

提示:通过一次添加一个测试来开发代码。 确保每次迭代后所有测试均通过。

调试失败的测试

  • 添加另一个测试:

#include...
// Verify that negative inputs throw an exception.
TEST_METHOD(NegativeRangeTest)
{
  wchar_t message[200];
  CRootFinder rooter;
  for (double v = -0.1; v > -3.0; v = v - 0.5)
  {
    try
    {
      // Should raise an exception:
      double result = rooter.SquareRoot(v);

      _swprintf(message, L"No exception for input %g", v);
      Assert::Fail(message, LINE_INFO());
    }
    catch (std::out_of_range ex)
    {
      continue; // Correct exception.
    }
    catch (...)
    {
      _swprintf(message, L"Incorrect exception for %g", v);
      Assert::Fail(message, LINE_INFO());
    }
  }
}
  • 生成解决方案并选择Run All,打开(或双击)失败的测试,失败的语句将突出显示。故障消息在“测试资源管理器”的详细信息窗格中可见。

NegativeRangeTests failed

  • 要查看测试失败的原因,请逐步执行以下功能:
    • 在SquareRoot函数的开始处设置一个断点。
    • 在失败的测试的快捷菜单上,选择“调试选定的测试”。

  • 当运行在断点处停止时,逐步执行代码。
  • 在要开发的函数中插入代码:
#include...
double CRootFinder::SquareRoot(double v)
{
    // Validate parameter:
    if (v < 0.0) { throw std::out_of_range("Can't do square roots of negatives"); }

现在所有测试都通过了。

All tests pass

提示:如果单个测试没有依赖项,从而不能以任何顺序运行它们,请在工具栏的设置菜单中打开并行测试执行。这样可以显着减少运行所有测试所需的时间。

重构代码而不更改测试

  • 简化平方根函数中的中央计算:

// old code:
//   result = result - (result*result - v)/(2*result);
// new code:
     result = (result + v/result)/2.0;
  • 生成解决方案并选择“全部运行”,以确保您没有引入错误。

提示:一组好的单元测试使您确信更改代码时没有引入错误。保持重构与其他更改分开。

下一步

  • 隔离。大多数DLL依赖于其他子系统,例如数据库和其他DLL,这些其他组件通常是并行开发的。为了允许在其他组件尚不可用时执行单元测试,您必须替换模拟。
  • 建立验证测试。您可以按设置的时间间隔在团队的构建服务器上执行测试。这样可以确保在整合多个团队成员的工作时不会引入错误。
  • 签入测试。您可以要求在每个团队成员将代码检入源代码管理之前执行一些测试。通常,这是一组完整的构建验证测试的子集。
  • 您还可以要求最低级别的代码覆盖率。

本文内容到这里就结束了,点击此处可以查看上部分内容。


想要购买Visual Studio正版授权,或了解更多产品信息请点击

慧聚IT



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@capbkgr.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP