Проблема в написании модульного теста «DivideByZero» с использованием CPPUnitTest в Visual Studio 2019 C ++ - PullRequest
4 голосов
/ 03 марта 2020

Модульное тестирование означает написание кода, который проверяет отдельные части или блоки приложения или библиотеки. Единица - это самая маленькая тестируемая часть приложения. Модульные тесты оценивают код изолированно. В C ++ это означает написание тестов для методов или функций. Я пишу калькулятор для базового c и пытаюсь использовать CPPUnitTest для тестирования кода в Visual Studio 2019. После этого мне также нужно создать его в Jenkins. Пожалуйста, не судите .. Я пишу модульный тест в первый раз ... это мой калькулятор. 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;
        }
    }
}

Это класс Cal c или "Cal c .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 Также предложите, какой еще метод я могу использовать для увеличения покрытия кода.

1 Ответ

2 голосов
/ 03 марта 2020

Не следует использовать assert::AreEqual при проверке исключений. Вы можете заключить код исключения в лямбду и передать его в 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;
...