Microsoft :: VisualStudio :: CppUnitTestFramework中的参数化测试方法

时间:2017-02-15 10:40:25

标签: c++ unit-testing nunit cppunit microsoft-cpp-unit-test

我正在使用 Microsoft :: VisualStudio :: CppUnitTestFramework 为我的C ++项目编写一些测试用例。在这里,我有一个案例,我必须运行具有不同参数的相同测试用例。

在Nunit Framework for CPP中,我可以通过以下代码实现这一目标。

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

}

通过传递这些参数,此测试将运行2次。

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

Microsoft :: VisualStudio :: CppUnitTestFramework 单元测试中是否有类似的方法来实现此目的。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

CppUnitTestFramework不提供参数化测试,但是没有什么可以阻止您简单地编写参数化函数并从测试中调用它。

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

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

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

答案 1 :(得分:0)

我遇到了类似的问题:我有一个接口和几个实现。当然我只想针对界面编写测试。另外,我不想为每个实现复制我的测试。因此,我搜索了一种将参数传递给我的测试的方法。好吧,我的解决方案并不是很漂亮,但它很简单,也是我迄今为止唯一提出的解决方案。

以下是我的问题解决方案(在您的情况下,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));
    }
};

您需要从build中排除“unittest.cpp”。

答案 2 :(得分:0)

快速简单的解决方案:

在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);
            }
        }
    };
}