4

我正在做一些C++測試驅動的開發。我有一套課程可以做同樣的事情,例如C++單元測試測試,使用模板測試類

相同的輸入給出相同的輸出(或應該,這就是我試圖測試)。我正在使用Visual Studio 2012的

CppUnitTestFramework。我想創建一個模板化的測試類,所以我只寫了一次測試,並且可以根據需要在類中進行模板化,但是我無法找到實現此目的的方法。我的目標:

/* two classes that do the same thing */ 
class Class1 
{ 
    int method() 
    { 
     return 1; 
    } 
}; 

class Class2 
{ 
    int method() 
    { 
     return 1; 
    } 
}; 

/* one set of tests for all classes */ 
template< class T> 
TEST_CLASS(BaseTestClass) 
{ 
    TEST_METHOD(testMethod) 
    { 
     T obj; 

     Assert::AreEqual(1, obj.method()); 
    } 
}; 

/* only have to write small amout to test new class */ 
class TestClass1 : BaseTestClass<Class1> 
{ 
}; 

class TestClass2 : BaseTestClass<Class1> 
{ 
}; 

有沒有一種方法,我可以做到這一點使用CppUnitTestFramework?

是否有另一個單元測試框架,可以讓我做到這一點?

回答

2

我不知道是否有一種方法與CppUnitTestFramework, 與我不熟要做到這一點,但東西,你可以肯定 在googletest 做的是指定的類的任意列表,並有框架 生成(模板明智)爲他們所有相同的測試。我認爲 將適合你的賬單。

您可以下載googletest作爲源here

你會想這個成語是:

typedef ::testing::Types</* List of types to test */> MyTypes; 
... 
TYPED_TEST_CASE(FooTest, MyTypes); 
... 
TYPED_TEST(FooTest, DoesBlah) { 
    /* Here TypeParam is instantiated for each of the types 
     in MyTypes. If there are N types you get N tests. 
    */ 
    // ...test code 
} 

TYPED_TEST(FooTest, DoesSomethingElse) { 
    // ...test code 
} 

研究primer和 的samples。然後去 的AdvancedGuideTyped Tests

還檢查了More Assertions

+1

歡呼的答案。對於任何看這個googletest的人來說,都有點痛苦。我使用了這些組合來指導http://blog.knatten.org/2012/09/26/installing-and-using-googletest-with-visual-studio/和http://stackoverflow.com/questions/531941 /如何到設置 - 谷歌-C測試的框架,GTEST-ON-視覺工作室2005年。它不會在Visual Studio 2012中編譯,除非在項目屬性中將編譯器設置爲2010版本。 –

0

我有一個類似的問題:我有一個接口和它的幾個實現。當然,我只想對接口編寫測試。另外,我不想複製每個實現的測試。

那麼,我的解決方案不是很漂亮,但它是直截了當的,也是我到現在爲止唯一的解決方案。

您可以對Class1和Class2執行相同的操作,然後爲每個實現添加更多專門的測試。

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」。