4

单元测试意味着编写代码来验证应用程序或库的各个部分或单元。单元是应用程序的最小可测试部分。单元测试孤立地评估代码。在 C++ 中,这意味着为方法或函数编写测试。我正在编写一个基本的计算器程序并尝试使用 CPPUnitTest 在 Visual Studio 2019 中测试代码。之后我也必须在 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;
        }
    }
}

这是 Calc 类或“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 还建议我可以使用哪种其他方法来增加我的代码覆盖率。

4

1 回答 1

2

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;
于 2020-03-03T12:48:14.853 回答