在 Visual Studio 2019 C++ 中使用 CPPUnitTest 编写 "DivideByZero" 单元测试用例时出现问题

Problem in writing "DivideByZero" Unit test case using CPPUnitTest in Visual Studio 2019 C++

单元测试意味着编写代码来验证应用程序或库的各个部分或单元。单元是应用程序中最小的可测试部分。单元测试孤立地评估代码。在 C++ 中,这意味着为方法或函数编写测试。 我正在编写一个基本的计算器程序,并尝试使用 CPPUnitTest 来测试 Visual studio 2019.After 中的代码,我也必须在 Jenkins 中构建它。 请不要判断..我是第一次写单元测试.. 这是我的 Calculator.cpp

#include <iostream>
#include "Calc.h"
using namespace std;

int main()
{
        Calc obj;
        float a, b;
        cin >> a >> b;
        int menu;
        cout << "Enter what operation you want(1-4);" << endl;
        cout << "1. Addition" << endl;
        cout << "2. Subtraction" << endl;
        cout << "3. Multiplication" << endl;
        cout << "4. Division" << endl;
        cin >> menu;
        switch (menu)
        {
        case 1:obj.add(a, b);
            break;
        case 2:obj.sub(a, b);
            break;
        case 3:obj.multiply(a, b);
            break;
        case 4:
            try
            {
                obj.divide(a, b);
            }
            catch (std::runtime_error& e)
            {
                cout << e.what() << "\n";
            }
            break;
        default:
        {
            cout << "Invalid input" << endl;
        }
    }
}

这是 class 计算器或 "Calc.h" 在这里,我使用 std::runtime_error 在除法零

上抛出错误
#pragma once
#include <stdexcept>
class Calc {

public:
    float add(float a, float b)
    {
        return a + b;
    }
    float sub(float a, float b) {

        return  a - b;
    }

    float multiply(float a, float b) {
        return  a * b;
    }

    float divide(float a, float b) {
        if (b == 0)
        {
            throw std::runtime_error("Division by zero condition!");
        }
        return a / b;
    }

};

我正在尝试使用 CPPUnitTest 为我的代码编写单元测试。 我已经使用 assert::AreEqual 编写了加法和减法的代码,但是对于除以零的条件,我不知道要编写测试用例。 这是我的单元测试代码。

#include "pch.h"
#include "CppUnitTest.h"
#include "../Calculator/Calc.h"
#include <stdexcept>

using namespace std;
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace CalculatorTest
{
    TEST_CLASS(CalculatorTest)
    {
    public:
        Calc cal;
        TEST_METHOD(AddTest)
        {
            float k = cal.add(3, 4);
            Assert::AreEqual(7.0f,k);
        }
        TEST_METHOD(SubTest)
        {
            float k = cal.sub(3, 4);
            Assert::AreNotEqual(-2.0f, k);
        }
        TEST_METHOD(DivByZeroTest)
        {
            //what should I write here
        }
    };
}

请帮我写一个测试方法。 我在某处读到 CPPUNIT_ASSERT_THROW(cal->divide(12,0), std::runtime_error); 但这对我来说不起作用。我怎样才能Assert::AreEqual 还建议我可以使用哪种其他方法来增加我的代码覆盖率。

检查异常时不应使用 assert::AreEqual。 您可以将异常抛出代码包装在 lambda 中并将其传递给 Assert::ExpectException<std::runtime_error>,如果抛出预期的异常,它应该断言 true

    TEST_METHOD(DivByZeroTest)
    {
        auto func = [] { return cal.divide(1.f, 0.f); };
        Assert::ExpectException<std::runtime_error>(func);
    }

我希望它在内部做这样的事情::

bool result = false;
try {
    func();
} catch(const std::runtime_error&) {
    result = true;
} catch(...) {
}
return result;