微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ctest报告测试成功,退出状态为1

如何解决ctest报告测试成功,退出状态为1

我有一个带有单元测试的项目,当我运行ctest(macos上的cmake版本3.18.2)时,所有测试都报告成功。但是,如果我自己运行其中一个测试,则它的退出状态为1。据我所知,这不应该发生,那么是什么原因引起的,又该如何解决呢?

该问题是一个粗心的小错误,但是出于其他遇到该问题的人的利益,我提供了一个答案,可以跳过其余问题。

不幸的是,我无法使用更小的最小工作示例来重现此行为。我会尝试提供尽可能多的相关信息,如果我遗漏了一些东西,请告诉我。这是单元测试的代码

#include "alignment_reader.h"

#define CATCH_CONfig_MAIN
#define CATCH_CONfig_COLOUR_NONE
#include "catch.h"

#include "string_conversions.h"

#include "exceptions.h"

namespace paste_alignments {

namespace test {

namespace {

SCENARIO("Test correctness of AlignmentReader::FromFile.","[AlignmentReader][FromFile][correctness]") {

  GIVEN("The name of a valid input file.") {
    std::string input_file{"test_data/valid_alignment_file.tsv"};

    WHEN("Constructed with default number of fields and chunk size.") {
      CHECK_NOTHROW(AlignmentReader::FromFile(input_file));
      /*AlignmentReader reader{AlignmentReader::FromFile(input_file)};

      THEN("Field number and chunk size are at default values.") {
        CHECK(reader.NumFields() == 12);
        CHECK(reader.ChunkSize() == 128 * 1000 * 1000);
      }*/
    }
  }
}

} // namespace

} // namespace test

} // namespace paste_alignments

当我取消注释部分时,退出代码更改为2,并且ctest仍然报告成功。

这是我运行ctest时发生的情况(带有和不带有注释部分):

$ ctest
Test project /Users/Jasper/cpp_projects/Pastealignments/debug
    Start 1: alignment_reader_test
1/1 Test #1: alignment_reader_test ............   Passed    0.16 sec

100% tests passed,0 tests Failed out of 1

Total Test time (real) =   0.17 sec

如果我单独运行测试并检查退出状态(其中的内容已注释掉),这就是我得到的:

$ ./test/alignment_reader_test 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alignment_reader_test is a Catch v2.12.2 host application.
Run with -? for options

-------------------------------------------------------------------------------
Scenario: Test correctness of AlignmentReader::FromFile.
      Given: The name of a valid input file.
       When: Constructed with default number of fields and chunk size.
-------------------------------------------------------------------------------
/Users/Jasper/cpp_projects/Pastealignments/test/alignment_reader_test.cc:64
...............................................................................

/Users/Jasper/cpp_projects/Pastealignments/test/alignment_reader_test.cc:65: Failed:
  CHECK_NOTHROW( AlignmentReader::FromFile(input_file) )
due to unexpected exception with message:
  Unable to open file: 'test_data/valid_alignment_file.tsv'.

===============================================================================
test cases: 1 | 1 Failed
assertions: 1 | 1 Failed

$ echo $?
1

当我添加注释部分时唯一改变的是两次测试均失败,并且退出状态为2而不是1。

此处带有--verbose标志:

$ ctest --verbose
UpdateCTestConfiguration  from :/Users/Jasper/cpp_projects/Pastealignments/debug/DartConfiguration.tcl
Parse Config file:/Users/Jasper/cpp_projects/Pastealignments/debug/DartConfiguration.tcl
UpdateCTestConfiguration  from :/Users/Jasper/cpp_projects/Pastealignments/debug/DartConfiguration.tcl
Parse Config file:/Users/Jasper/cpp_projects/Pastealignments/debug/DartConfiguration.tcl
Test project /Users/Jasper/cpp_projects/Pastealignments/debug
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
    Start 1: alignment_reader_test

1: Test command: /Users/Jasper/cpp_projects/Pastealignments/debug/test/alignment_reader_test
1: Test timeout computed to be: 1500
1: ===============================================================================
1: All tests passed (1 assertion in 1 test case)
1: 
1/1 Test #1: alignment_reader_test ............   Passed    0.36 sec

100% tests passed,0 tests Failed out of 1

Total Test time (real) =   0.36 sec

我没有更改ctest配置(如建议的here)。 CMakeLists.txt看起来像这样:

add_executable(alignment_reader_test
        "${PROJECT_SOURCE_DIR}/test/alignment_reader_test.cc"
        "${PROJECT_SOURCE_DIR}/src/alignment_reader.cc"
        "${PROJECT_SOURCE_DIR}/src/alignment_batch.cc"
        "${PROJECT_SOURCE_DIR}/src/scoring_system.cc"
        "${PROJECT_SOURCE_DIR}/src/alignment.cc"
        "${PROJECT_SOURCE_DIR}/src/helpers.cc")
target_include_directories(alignment_reader_test PUBLIC
        "${PROJECT_SOURCE_DIR}/test"
        "${PROJECT_SOURCE_DIR}/include"
        "${PROJECT_SOURCE_DIR}/lib/catch/include")
add_test(NAME alignment_reader_test COMMAND alignment_reader_test)

解决方法

由于@Tsyvarev,我发现了问题。

构建目录结构如下:

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="gridchart"></div>

当CMake运行build/ |--test/ |--test_executable |--test_data/ |--test_datafile 时,它将在目录test_executable中运行它。

当我单独运行可执行文件时,我从test目录运行了该可执行文件。 (build)。

在单元测试代码中,./test/test_executable被称为test_datafile。当测试是从test_data/test_datafile可执行文件运行时(与我一样),而不是从build目录运行。

因此,当ctest运行测试时,它实际上应该成功完成。

实际上,如果我先build/test进入cd,则测试的退出代码为0。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?