我正在做一些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> …Run Code Online (Sandbox Code Playgroud) c++ templates unit-testing visual-c++ microsoft-cpp-unit-test
我正在开发一个C++项目,并开发了一些测试用例.我能够执行测试用例,直到所有测试用例突然从测试资源管理器中消失.我的意思是说测试资源管理器中没有显示测试方法,即使测试项目编译正确.
我按照这里给出的步骤没有成功.
这些是我做过的事情:
%temp%文件夹的内容.X64.(Test>Test Settings>Default Processor Architecture>X64)Restarted VS2015.Restarted 系统.devenv /safemode(在命令提示符下),没有运气.devenv /ResetSettings(在命令提示符下),没有运气.笔记:
我正在使用 Microsoft 的 CppUnitTestFramework 编写一些单元测试。
我想测试一下,我调用的方法是否抛出了正确的异常。我的代码是:
TEST_METHOD(test_for_correct_exception_by_input_with_whitespaces)
{
std::string input{ "meet me at the corner" };
Assert::ExpectException<std::invalid_argument>(AutokeyCipher::encrypt(input, primer));
}
Run Code Online (Sandbox Code Playgroud)
在下面的链接中,我写了类似于上一个答案的电话:
编译它时,我收到C2064错误:术语不计算为采用 0 个参数的函数
为什么这不起作用?
c++ unit-testing exception assertion microsoft-cpp-unit-test
TL;DR: 您可以使用 GMock 向 Microsoft 本机 C++ 单元测试添加模拟功能。详情请参阅下面我的回答。
我想开始向我现有的一组本机单元测试添加模拟。这些测试是使用 Microsoft 的CppUnitTestFramework框架编写的,该框架不支持模拟。我真的不想将整个测试套件转换为另一个框架只是为了添加一些模拟。
Google 的GMock框架似乎提供了我需要的一切,并且文档表明它可以与gtest. 因此,根据像这样的博客文章中的建议,我创建了几个单元测试。
TEST_MODULE_INITIALIZE(ModuleInitialize)
{
// Enable google mock
GTEST_FLAG(throw_on_failure) = true;
int argc = 0;
TCHAR **argv = nullptr;
InitGoogleMock(&argc, argv);
}
TEST_CLASS(GMockTests)
{
public:
MockTestClass _mockObj;
TEST_METHOD(Method1_ParamIsOne_Method2CalledWithOne)
{
EXPECT_CALL(_mockObj, Method2(1)).Times(1);
_mockObj.Method1(1);
}
TEST_METHOD(Method1_ParamIsZero_IntentionallyFail)
{
// Expectation will fail
EXPECT_CALL(_mockObj, Method2(1)).Times(1);
_mockObj.Method1(0);
}
};
Run Code Online (Sandbox Code Playgroud)
结果并不令人满意。期望确实有效(第一个方法通过),但如果任何期望失败,则整个运行将中止,测试输出中仅显示以下无用消息:
[3/27/2019 11:39:17 AM Error] The active test run was aborted. Reason:
[3/27/2019 11:39:17 AM Informational] …Run Code Online (Sandbox Code Playgroud) c++ unit-testing visual-c++ googlemock microsoft-cpp-unit-test
我正在编写一个机器人控制器类Controller,其中我为 4 个可控电机中的每一个使用一个Axis结构体。
对于每个测试,我想重置所有内容,因此我在类中创建了一个指针,在每个测试方法之前将其更改为新的控制器。初始化在 TEST_METHOD_INITIALIZE 中工作正常,但是一旦调用任何 TEST_METHOD,程序似乎会重置轴指针。
感谢您的帮助!
编辑:经过进一步分析,我得出的理论是,初始化的 Axis 对象 Axis init_mx 在方法完成后将被删除。
Edit2:我认为这是一个稍微复杂一点的问题,如下所示:Pointer to local variable in C++ 尽管如此,我没有找到一种方法来重置每个方法的 Axis 变量,而不实际重置其中的每个变量。
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
...
namespace UnitTest
{
TEST_CLASS(UnitTestController)
{
public:
Controller* controller;
struct Axis *mx, *my, *mz, *mg;
TEST_METHOD_INITIALIZE(methodName)
{
Axis init_mx(50), init_my(50), init_mz(50), init_mg(5);
mx = &init_mx;
my = &init_my;
mz = &init_mz;
mg = &init_mg;
Controller init_controller(mx, my, mz, mg);
controller = &init_controller;
Run Code Online (Sandbox Code Playgroud)
}
...
TEST_METHOD(id_3_next_mode)
{
mx->position = 5;
controller->getAxisPositionMx(); …Run Code Online (Sandbox Code Playgroud) c++ ×5
unit-testing ×3
visual-c++ ×3
assertion ×1
cppunit ×1
exception ×1
googlemock ×1
templates ×1