使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试

Posted

技术标签:

【中文标题】使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试【英文标题】:Unit testing C Code in Visual Studio 2017 with Native Unit Test Project 【发布时间】:2018-06-07 08:57:34 【问题描述】:

我想在 Visul Studio 2017 中为 C 项目进行单元测试。它是一个嵌入式项目库。我希望对 lib 进行尽可能少的更改。只需在VS中编译c代码我已经添加了一些#ifdef WIN32。可以再添加一些。

从使用 Visual C++ 本机单元测试项目开始。但是当想要从 C 文件测试私有静态函数并在项目中注入值变量时会遇到问题。

    将我的嵌入式项目作为静态库包含到 VS 解决方案中。 (或者应该使用动态链接库或其他东西?) 创建了本机单元测试项目,并将其命名为 UnitTest1。 在 UnitTest1 中添加了这一行,据我了解它将包括我想要测试的库。 #pragma comment(lib, "../Release/Embedded.lib")

    在嵌入的代码头文件中,我添加了这个宏来创建我将执行测试的库。

    #pragma once
    #ifdef EXPORT_TEST_FUNCTIONS
    #define UNITTEST_Embedded_EXPORT __declspec(dllexport)
    #else
    #define UNITTEST_Embedded_EXPORT
    #endif
    
    
    
    inline UNITTEST_ZAP_EXPORT static bool isActiv(void);
      在嵌入的C文件中,我添加了这一行#define EXPORT_TEST_FUNCTIONS和这个函数:

    UNITTEST_ZAP_EXPORT static bool isActiv();
    
        return false;
    
      但是当我构建 UnitTest1 得到错误 LNK2001。

非常不确定如何继续使其工作。谁能指导我解决我的问题?我希望能够测试 C 代码中的所有函数。希望它不难理解需要什么帮助。我才发展了几年。

【问题讨论】:

What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 【参考方案1】:

我和你有同样的问题。您需要向 Visual Studio 中的 C++ 编译器说明,当您包含 C 函数的声明时,会出现 C 标头。所以你的UnitTest1.cpp 应该以:

开头
extern "C" 
#include "somecode.h"

static_lib1.h应该包含类似:

 #ifndef STATIC_LIB1_H_
 #define STATIC_LIB1_H_

 SWord doSomeThing();

 #endif

删除在 h 和 c 文件中添加的所有额外代码以进行单元测试,它不应该是必需的。最好的单元测试是不要对你测试的代码做任何更改,因为单元测试需要它。

我确定这应该可以解决您的问题。

【讨论】:

以上是关于使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 中正确链接文件以运行本机测试?

无法在 Visual Studio 2017 中构建我的单元测试项目

如何在Visual Studio项目和单元测试项目之间建立联系?

在 Visual Studio 2013 中使用 HttpClient 进行单元测试/集成测试 Web API

在Visual Studio2015中使用单元测试

您可以在单元测试项目中使用 Visual Studio 数据库项目来为功能测试设置一个空数据库吗?