C++ Google Test discovery正在mac OS X上添加并运行我的所有测试两次

C++ Google Test discovery正在mac OS X上添加并运行我的所有测试两次,c++,macos,googletest,C++,Macos,Googletest,我会尽量简短,但要简洁 我一直在将公司使用的谷歌测试框架(以及一套测试)从Windows移植到mac os。除了在MAC上构建/运行我的测试外,我几乎所有的东西都在工作。。。Google测试包括我定义的每个测试两次 在MAC上,我的Makefile输出“main_test”,为了快速显示问题,如果我使用--gtest_list_tests选项,您可以看到我的简化测试列表被再次复制 $ ./main_test --gtest_list_tests BEGINNING Google Test! sm

我会尽量简短,但要简洁

我一直在将公司使用的谷歌测试框架(以及一套测试)从Windows移植到mac os。除了在MAC上构建/运行我的测试外,我几乎所有的东西都在工作。。。Google测试包括我定义的每个测试两次

在MAC上,我的Makefile输出“main_test”,为了快速显示问题,如果我使用--gtest_list_tests选项,您可以看到我的简化测试列表被再次复制

$ ./main_test --gtest_list_tests
BEGINNING Google Test!
sman_drift_test.
  slow_forward
  medium_back
  slow_forward
  medium_back
motor_self_test/motor_test.
  self_test/0  # GetParam() = "rev"
  self_test/1  # GetParam() = "fwd"
  self_test/0  # GetParam() = "rev"
  self_test/1  # GetParam() = "fwd"
在windows上的VS中编译的完全相同的源文件会生成我的“unit_test_d.exe”文件,如果我从“cmd”shell运行相同的--gtest_list_tests选项,我会得到以下结果:

>unit_test_d.exe --gtest_list_tests
BEGINNING Google Test!
sman_drift_test.
  slow_forward
  medium_back
motor_self_test/motor_test.
  self_test/0  # GetParam() = "rev"
  self_test/1  # GetParam() = "fwd"
在我的servo_drift_test.cpp文件中,这些测试只有一个副本,在motor_self_test.cpp文件中也是如此

TEST_F(sman_drift_test, slow_forward) 
{
     // Do my test stuff...
}

TEST_F(sman_drift_test, medium_back) 
{
     // Do my test stuff...
}
这件事我已经搞了好几天了。。。我已经排除了很多可能的选择。基本上包括我所有的公司代码

我最初在这个web链接上遵循MAC的安装说明:

注意:我应该注意。。。在遵循这些说明的同时,我确实更改了目录并使用了树中已经存在的“gtest”文件(在底部列出的版本),因此,在重新编译我们已经下载的源代码并将这些目录放置在正确的位置时,我可能会弄乱文件的位置,或者可能是一个构建选项。希望不会。我们的原始库与VS 2015 for Windows兼容。。。我使用上面链接中列出的cmake和安装步骤构建了相同的源文件。我在/usr/local/inc和lib中有gtest.h和libgtest.a,所以include路径应该是好的(?。

并按照示例代码的指示运行它。同样地。。。我看到了同样的问题。。。注意:我也注释掉了“TEST(FactorialTest,Zero)”案例,只是为了验证注释掉1个测试。。。确实消除了这两种情况。的确如此。但是你可以看到。。。“阴性”和“阳性”都会被添加两次,以及所有3个“IsPrime()”测试

同样,实际运行测试会导致重复的测试运行。样本中有6个测试用例,3个在FactorialTest中,3个在IsPrimeTest中。您可以看到它正在构建/运行每一组两次。。。每套6个,共12个:

$ ./sample1
Running main() from gtest_main.cc
[==========] Running 12 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 6 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 6 tests from FactorialTest (0 ms total)

[----------] 6 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 6 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 12 tests from 2 test cases ran. (0 ms total)
[  PASSED  ] 12 tests.
我在这个问题上做了很多研究,不认为这是与我自己的库或对象文件的链接问题

当然,这个问题可能与GoogleTest的一些构建选项以及它创建/安装的库(-lgtest)有关。有可能它被链接了两次(?),或者在google测试中是否有某种定义或参数设置,上面写着“运行我所有的测试两次”?注意:此问题不是“/sample\u test--gtest\u repeat=2”选项。这会重复我重复的测试两次,所以它们每次运行4次

最后,这可能是一个潜在的暗示。。。我是怎么从这个兔子洞里钻出来的。。。当我使用完整的代码堆栈时,而不是“示例”。。。在这里我连接到一个串行端口并维护我的串行句柄结构。。。正如你所看到的。。。一旦我用地址(0x6d009f0)和文件描述符FD[3]设置指针。。。我把它弄丢了。。。或者更可能有一个额外的定义(为NULL)。。。使用测试的“复制”实例

另外,奇怪的是它在哪里变成空的。。。以及它回来的地方。流程如下所示:

Start Google Test
 - Do Init.  IE: Establish and init Serial port (init, open, config port)
    - Pointer GOOD Addr(0x6d009f0) FD[3]
    - Get Device Serial Number (Works)
 - Begin servo_drift_test
    - Do "SetUpTestCase()" Init Code
       - Set Device Mode to 2, required for this "set" of tests.
       - Pointer GOOD  Addr(0x6d009f0) FD[3]
    - Run First Test Case *** Now I presume this is the "duplicate" case
       - Pointer LOST Addr(0)... NULL (Not initialized)
       - TEST instance ONE FAILS
    - Run Second Test Case *** This appears to have the matching memory space as the original init and setup code!!!
       - Runs a SUCCESSFUL "get_params" command.
       - Pointer GOOD  Addr(0x6d009f0) FD[3]
       - TEST instance TWO PASSED
    - Servo Drift Test "TearDownTestCase()"
       - Nothing To Do Here
 - Complete Test Summary
如您所见,它运行了测试用例的两个实例。。。虽然在这个非常简单的简化示例中只有1个“测试”。我试图尽可能地清理它,但仍然显示调试打印。:)

我觉得奇怪的是,测试用例的“设置”只运行一次。。。而且跑得很好。但是同一测试的两个实例,显然其中一个不在相同的内存空间中。这可能是谷歌测试添加“测试”与“测试集”的一个症状。但我猜这是对整个问题的暗示

  $ ./main_test port=/dev/cu.usbserial-FTFMEXDK
unit_test version: 6.00.00
  Set Port String[64]: /dev/cu.usbserial-FTFMEXDK <---
  Global Port String: /dev/cu.usbserial-FTFMEXDK <---
using serial port /dev/cu.usbserial-FTFMEXDK
SUCCESS - GET_PORT_BY_NAME
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: -1
                  - Bits: -1
                  - Parity: -1
                  - Stopbits: -1
                  - FD[-1]

SUCCESS - SP_OPEN in Mode[3]
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: 9600
                  - Bits: 8
                  - Parity: -1
                  - Stopbits: 1
                  - FD[3]

SUCCESS - SET_BAUDRATE 460800
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: 460800
                  - Bits: 8
                  - Parity: 0
                  - Stopbits: 1
                  - FD[3]



  WRITE
    - [29]: sys_config get_smart_sn
  PROXY RECEIVE START
 TOK[19] EXP[19] ==>  0x00000000  1 0 E 2 0 1 1 7 0 6 2 7 0 0 1 4 8 R  
Target ALIVE, unit serial no: '10E20117062700148R'


BEGINNING Google Test!
Note: Google Test filter = *.slow_forward
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from sman_drift_test
             PORT - Struct Addr port2print[6d009f0]
                  - FD[3]
  WRITE
    - [24]: sys_config set_mode  2 
  PROXY RECEIVE START
 TOK[1] EXP[1] ==>  0x00000000   

[ RUN      ] sman_drift_test.slow_forward
             PORT - Struct Addr port2print[0]
                  - NULL PORT Structure!!! 

          ERROR - comm port initialization failed
servo_drift_test.cpp:485: Failure
Failed
UNABLE TO COMMUNICATE WITH DEVICE


[  FAILED  ] sman_drift_test.slow_forward (15013 ms)
[ RUN      ] sman_drift_test.slow_forward
              - PreTestFlags[0x7]
             PORT - Struct Addr port2print[6d009f0]
                  - FD[3]

  WRITE
    - [17]: sman get_params 
  PROXY RECEIVE START
 TOK[13] EXP[13] ==>  0x00000000  1 0 0 -1471 1 0 0 0 0 0 1 75000  

[       OK ] sman_drift_test.slow_forward (29114 ms)
[----------] 2 tests from sman_drift_test (44127 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (45607 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] sman_drift_test.slow_forward
其他背景: 我的公司给了我一段代码,这是一个google测试框架(v1.7.0)和一整套测试,它们通过串行连接与我们的产品连接。好几年没人看过这个了,它都是基于windows的。生成基于windows的“unit_test_d.exe”文件输出。我能够建立和扩大它显着和该项目是建立在VS 2015。。。我能够将其向前移植,并在VS 2017 v15.6.7中打开/构建该项目

然后,我被赋予了将整个项目移植到mac的任务,这样我们就可以与我们已有的用于我们产品的BLE(蓝牙)引擎接口。同样,继续从mac终端进行测试,而不需要windows VM或windows box。我已经成功地移植了代码,因此它仍然可以在两种平台上运行(很多#ifdef(WIN32或#ifdefAPPLE),现在我可以在Windows上的VS以及带有终端外壳的mac os x上构建该项目

任命(如果其中任何一项措辞不正确):

对此问题的任何帮助都将不胜感激。很抱歉,这篇文章太长了,但我想在第一次提供尽可能多的具体信息!:)
谢谢

我原本认为这可能是我的编译器(gcc/g++)的问题,因为当我在XCODE中构建时,这个问题就消失了

然而,XCODE所做的只是将输出文件“sample1”放在不同的位置。事实证明,我运行文件的实际位置很重要。我可以从test/src/目录运行它,所有的测试都是重复的,当我从/use/local/bin/(XCODE放在哪里)运行它时,它运行得很好。另外。。。将(完全相同的)文件从一个位置移动到另一个位置,并执行它将导致工作或不工作。。。取决于我运行文件的位置

我能够使用Activ
  $ ./main_test port=/dev/cu.usbserial-FTFMEXDK
unit_test version: 6.00.00
  Set Port String[64]: /dev/cu.usbserial-FTFMEXDK <---
  Global Port String: /dev/cu.usbserial-FTFMEXDK <---
using serial port /dev/cu.usbserial-FTFMEXDK
SUCCESS - GET_PORT_BY_NAME
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: -1
                  - Bits: -1
                  - Parity: -1
                  - Stopbits: -1
                  - FD[-1]

SUCCESS - SP_OPEN in Mode[3]
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: 9600
                  - Bits: 8
                  - Parity: -1
                  - Stopbits: 1
                  - FD[3]

SUCCESS - SET_BAUDRATE 460800
             PORT - Struct Addr port2print[6d009f0]
                  - Name: /dev/cu.usbserial-FTFMEXDK
                  - Baudrate: 460800
                  - Bits: 8
                  - Parity: 0
                  - Stopbits: 1
                  - FD[3]



  WRITE
    - [29]: sys_config get_smart_sn
  PROXY RECEIVE START
 TOK[19] EXP[19] ==>  0x00000000  1 0 E 2 0 1 1 7 0 6 2 7 0 0 1 4 8 R  
Target ALIVE, unit serial no: '10E20117062700148R'


BEGINNING Google Test!
Note: Google Test filter = *.slow_forward
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from sman_drift_test
             PORT - Struct Addr port2print[6d009f0]
                  - FD[3]
  WRITE
    - [24]: sys_config set_mode  2 
  PROXY RECEIVE START
 TOK[1] EXP[1] ==>  0x00000000   

[ RUN      ] sman_drift_test.slow_forward
             PORT - Struct Addr port2print[0]
                  - NULL PORT Structure!!! 

          ERROR - comm port initialization failed
servo_drift_test.cpp:485: Failure
Failed
UNABLE TO COMMUNICATE WITH DEVICE


[  FAILED  ] sman_drift_test.slow_forward (15013 ms)
[ RUN      ] sman_drift_test.slow_forward
              - PreTestFlags[0x7]
             PORT - Struct Addr port2print[6d009f0]
                  - FD[3]

  WRITE
    - [17]: sman get_params 
  PROXY RECEIVE START
 TOK[13] EXP[13] ==>  0x00000000  1 0 0 -1471 1 0 0 0 0 0 1 75000  

[       OK ] sman_drift_test.slow_forward (29114 ms)
[----------] 2 tests from sman_drift_test (44127 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (45607 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] sman_drift_test.slow_forward
$ cat Makefile 
# Include directories for rpc .h files
RPCINC=../../../Common/rpc/inc/
RPCSRC=../../../Common/rpc/src/

# Include directory for the "system_mode.h" include
TAINC=../../../Tensioner/application/inc/

# Direcroty path for libserialport
LSDIR=../libserialport/

all: main_test

main_test: rpclibstuff.a 
    g++ -std=c++11 -stdlib=libc++ main.cpp servo_drift_test.cpp motor_test.cpp -lgtest -lpthread -o main_test -I $(RPCINC) -I $(LSDIR) -L. -lrpclibstuff -lserialport

rpclibstuff.a: rpc_util.o rpc_proxy.o rpc_proxy_util.o rpc_dispatch_util.o
    ar rcs librpclibstuff.a rpc_dispatch_util.o rpc_proxy.o rpc_proxy_util.o rpc_util.o


# gcc "-c" option compiles source files without linking.
rpc_util.o: $(RPCSRC)rpc_util.c
    gcc -c $(RPCSRC)rpc_util.c -o rpc_util.o -I $(RPCINC) -I $(TAINC)

rpc_proxy.o: $(RPCSRC)rpc_proxy.c
    gcc -c $(RPCSRC)rpc_proxy.c -o rpc_proxy.o -I $(RPCINC)

rpc_proxy_util.o: $(RPCSRC)rpc_proxy_util.c
    gcc -c $(RPCSRC)rpc_proxy_util.c -o rpc_proxy_util.o -I $(RPCINC)

rpc_dispatch_util.o: $(RPCSRC)rpc_dispatch_util.c
    gcc -c $(RPCSRC)rpc_dispatch_util.c -o rpc_dispatch_util.o -I $(RPCINC)

clean:
    rm *.o *.a main_test