Nano Hash - криптовалюты, майнинг, программирование

Метод параметризованного теста в Microsoft::VisualStudio::CppUnitTestFramework

Я пишу несколько тестовых примеров для своего проекта C++, используя Microsoft::VisualStudio::CppUnitTestFramework. Здесь у меня есть случай, когда мне нужно запустить один и тот же тестовый пример с разными параметрами.

В Nunit Framework для CPP я могу добиться этого с помощью следующего кода.

[Test, SequentialAttribute]
void MyTest([Values("A", "B")] std::string s)
{

}

При передаче этих параметров этот тест будет запущен 2 раза.

MyTest("A")
MyTest("B")

Есть ли аналогичный способ добиться этого в модульном тесте Microsoft::VisualStudio::CppUnitTestFramework.

Любая помощь высоко ценится.


Ответы:


1

CppUnitTestFramework не поддерживает параметризованные тесты, но ничто не мешает вам просто написать параметризованную функцию и вызвать ее из ваших тестов.

void MyTest(char *param)
{
    // Actual test code here    
}

TEST_METHOD(MyTest_ParamA)
{
    MyTest("A");
}

TEST_METHOD(MyTest_ParamB)
{
    MyTest("B");
}
24.03.2019

2

У меня была аналогичная проблема: у меня есть интерфейс и несколько его реализаций. Конечно, я хочу писать тесты только для интерфейса. Также я не хочу копировать свои тесты для каждой реализации. Поэтому я искал способ передать параметры своему тесту. Что ж, мое решение не очень красивое, но оно простое и единственное, что я придумал до сих пор.

Вот мое решение моей проблемы (в вашем случае CLASS_UNDER_TEST будет параметром, который вы хотите передать в тест):

setup.cpp

#include "stdafx.h"

class VehicleInterface
{
public:
    VehicleInterface();
    virtual ~VehicleInterface();
    virtual bool SetSpeed(int x) = 0;
};

class Car : public VehicleInterface {
public:
    virtual bool SetSpeed(int x) {
        return(true);
    }
};

class Bike : public VehicleInterface {
public:
    virtual bool SetSpeed(int x) {
        return(true);
    }
};


#define CLASS_UNDER_TEST Car
#include "unittest.cpp"
#undef CLASS_UNDER_TEST


#define CLASS_UNDER_TEST Bike
#include "unittest.cpp"
#undef CLASS_UNDER_TEST

unittest.cpp

#include "stdafx.h"
#include "CppUnitTest.h"

#define CONCAT2(a, b) a ## b
#define CONCAT(a, b) CONCAT2(a, b)

using namespace Microsoft::VisualStudio::CppUnitTestFramework;


TEST_CLASS(CONCAT(CLASS_UNDER_TEST, Test))
{
public:
    CLASS_UNDER_TEST vehicle;
    TEST_METHOD(CONCAT(CLASS_UNDER_TEST, _SpeedTest))
    {
        Assert::IsTrue(vehicle.SetSpeed(42));
    }
};

Вам нужно будет исключить «unittest.cpp» из сборки.

01.11.2017

3

Быстрое и простое решение:

Создайте вектор с вашими тестовыми примерами в TEST_METHOD_INITIALIZE, затем выполните итерацию по вектору в каждом тестовом примере.

#include "stdafx.h"
#include "CppUnitTest.h"
#include <vector>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace SomeTests
{
    TEST_CLASS(Some_Tests)
    {
    public:
        std::vector<int> myTestCases;

        TEST_METHOD_INITIALIZE(Initialize_Test_Cases)
        {
            myTestCases.push_back(1);
            myTestCases.push_back(2);
            myTestCases.push_back(3);
        }

        TEST_METHOD(Test_GreaterThanZero)
        {
            for (auto const& testCase : myTestCases)
            {
                Assert::IsTrue(testCase > 0);
            }
        }
    };
}
20.06.2019
  • Это нормально, но как узнать, какой тест не пройден? Если бы вместо этого мой тест был Assert::IsTrue(testCase % 2 == 1), то я бы провалил 2-й случай, но вся информация, которую я получил, это то, что Test_IsOdd (переименование из GreaterThanZero) не удалось, а не в каком случае - верно? 22.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..