标签: microsoft-cpp-unit-test

使用模板测试类的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> …
Run Code Online (Sandbox Code Playgroud)

c++ templates unit-testing visual-c++ microsoft-cpp-unit-test

5
推荐指数
1
解决办法
2701
查看次数

Visual Studio 2015不会发现单元测试:C++

我正在开发一个C++项目,并开发了一些测试用例.我能够执行测试用例,直到所有测试用例突然从测试资源管理器中消失.我的意思是说测试资源管理器中没有显示测试方法,即使测试项目编译正确.

我按照这里给出的步骤没有成功.

这些是我做过的事情:

  • 我删除了%temp%文件夹的内容.
  • 我将默认的处理器架构更改为X64.(Test>Test Settings>Default Processor Architecture>X64)
  • Restarted VS2015.
  • Restarted 系统.
  • 我试过跑devenv /safemode(在命令提示符下),没有运气.
  • 我试过跑devenv /ResetSettings(在命令提示符下),没有运气.

笔记:

  • 我的解决方案中只有一个测试项目,它现在只包含一些测试.
  • 我的项目文件位于网络驱动器上,因为我不允许在本地存储.
  • 我无法禁用防病毒软件或防火墙,我的系统没有管理员权限.

c++ microsoft-cpp-unit-test visual-studio-2015

5
推荐指数
1
解决办法
667
查看次数

如何正确调用 Assert::ExpectException?

我正在使用 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)

在下面的链接中,我写了类似于上一个答案的电话:

C++/CX 中的函数指针

编译它时,我收到C2064错误:术语不计算为采用 0 个参数的函数

为什么这不起作用?

c++ unit-testing exception assertion microsoft-cpp-unit-test

5
推荐指数
1
解决办法
2802
查看次数

如何将 Google Mock 与 CppUnitTestFramework 结合使用

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

4
推荐指数
1
解决办法
3809
查看次数

如何使用 Visual Studio CppUnitTestFramework 初始化测试变量

我正在编写一个机器人控制器类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++ cppunit visual-c++ microsoft-cpp-unit-test

2
推荐指数
1
解决办法
3390
查看次数