当前位置 : 主页 > 手机开发 > 其它 >

使用bazel为具有模拟依赖关系的C构建单元测试

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个C代码库,我正在尝试用Bazel构建.这个代码库包含单元测试,使用 fff库在C中生成函数模拟.虽然实际库并不重要,但我对函数模拟的整个概念有疑问. 现在我有一个makefile,我链接并运
我有一个C代码库,我正在尝试用Bazel构建.这个代码库包含单元测试,使用 fff库在C中生成函数模拟.虽然实际库并不重要,但我对函数模拟的整个概念有疑问.

现在我有一个makefile,我链接并运行我的测试.当我构建测试时,我编译并链接测试库和测试源本身.此测试还定义了库依赖项的模拟.链接时,模拟符号会被解析为模拟实现,并且所有内容都按预期工作.但它这样做的原因是我没有链接实际的依赖库,我只链接测试源中定义的模拟符号.

主要问题是:我如何使用Bazel做到这一点?当链接cc_test目标的二进制文件时,Bazel compilis并链接所有传递依赖项.由于受测试的库依赖于(通过deps)符号的实际实现,这个真实的定义与模拟的一起被链接,自然我得到这个错误:XXX的多重定义.

例:

cc_library(
  name = "a",
  # a.cc has the real version of "void some_function()".
  srcs = ["a.cc"],
  hdrs = ["a.h"],
)

# This test is working just fine.
cc_test(
  name = "a_test",
  srcs = ["a_test.cpp"],
  deps = [":a"],
)

cc_library(
  name = "b",
   # b.cc includes a.h and uses "void some_function()".
  srcs = ["b.cc"],
  hdrs = ["b.h"],
  deps = [":a"],
)

# This test has two definitions for "void some_function()":
# the real one and the mock one.
cc_test(
  name = "b_test",
  # b_test.cpp has the mock version of "void some_function()".
  srcs = ["b_test.cpp"],
  deps = [":b"],
)

我不是巴泽尔的新手,但我也不是专家,花了很多时间尝试我失败的事情.有关如何使其工作的任何建议?

您的问题可能是一个非常基本的问题,它与名称空间和/或扩展类有关.

根据定义,c没有名称空间,但可以以某种方式模拟它们:
https://stackoverflow.com/a/28535585/1019850

但是,由于您可能使用c而且从不使用c,因此可以直接使用命名空间.

具体的问题是你有两倍的功能,用命名空间a.some_function()和b.some_function()表示.

在Bazel中有几个选项如何解决它,我发布了简短的复制片段,你要在链接页面上阅读的细节.

deps = [
    "@gtest//:main",
    "//lib:hello-greet",
],

链接:https://docs.bazel.build/versions/master/cpp-use-cases.html
在那里,代码片段也用于测试,但我认为这与您的问题无关.

然后在Bazel中存在工具链,这是一个例子:

config_setting(
    name = "on_linux",
    constraint_values = [
        "@bazel_tools//platforms:linux",
    ],
)

config_setting(
    name = "on_windows",
    constraint_values = [
        "@bazel_tools//platforms:windows",
    ],
)

bar_binary(
    name = "myprog",
    srcs = ["mysrc.bar"],
    compiler = select({
        ":on_linux": "//bar_tools:barc_linux",
        ":on_windows": "//bar_tools:barc_windows",
    }),
)

链接:https://docs.bazel.build/versions/master/toolchains.html

因为我不是用c或c编程,所以我需要花费相当长的时间来挖掘解决方案,所以我要保持它没有真正的解决方案,但我希望问题和解决方法的方法得到了一点清楚.我首先尝试使用第二个链接,位于上面的第一个片段下面.

网友评论