7

I'm developing a CMake project in Visual Studio 2019, and I want to perform unit testing with boost::test by using the Visual Studio Test Explorer.

I've the following CMakeLists.txt that defines a boost unit test project for some code:

cmake_minimum_required (VERSION 3.10.0)

include(CTest)

enable_testing()

project (datatest)

message (STATUS "Building project ${PROJECT_NAME}")

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY})
set (Boost_USE_STATIC_LIBS ON)
set (Boost_USE_MULTITHREADED ON)
unset (Boost_INCLUDE_DIR CACHE)
unset (Boost_LIBRARY_DIRS CACHE)
set (CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH})
find_package (Boost COMPONENTS unit_test_framework log system REQUIRED)

include_directories (${CMAKE_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR})

set (TEST_SRC
  stdafx.cpp
  IconTest.cpp
  AttitudeTest.cpp
  LLAtest.cpp
  Model3DTest.cpp
  PlayerTest.cpp
  TimeDateTest.cpp
  )

add_executable (${PROJECT_NAME} ${TEST_SRC})

# Creating a function for easily adding tests
#
# Parameters:
#  ModuleName: Name of the module. It should be the same as the file name.
#  TestNames: List of names for tests for that file
function(create_file_tests MODULE_NAME MODULE_TESTS)
foreach (SINGLE_TEST ${MODULE_TESTS})
  message (STATUS "Adding test DataTest.${MODULE_NAME}.${SINGLE_TEST}")
  add_test(NAME "DataTest.${MODULE_NAME}.${SINGLE_TEST}" COMMAND ${PROJECT_NAME} --run_test=${MODULE_NAME}/${SINGLE_TEST} --catch_system_error=yes)
endforeach(SINGLE_TEST)
endfunction(create_file_tests)

# Creating tests for every file
set (MODULE_NAME IconTest)
set (MODULE_TESTS Constructor)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

set (MODULE_NAME AttitudeTest)
set (MODULE_TESTS DefaultConstructor ValueConstructor SetRoll SetPitch SetYaw)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

set (MODULE_NAME LLATest)
set (MODULE_TESTS DefaultConstructor ValueConstructor SetLatitude SetLongitude SetAltitude)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

set (MODULE_NAME Model3DTest)
set (MODULE_TESTS Constructor)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

set (MODULE_NAME PlayerTest)
set (MODULE_TESTS DefaultConstructor SetLLA01 SetLLA02)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

set (MODULE_NAME TimeDateTest)
set (MODULE_TESTS DefaultConstructor)
create_file_tests(${MODULE_NAME} "${MODULE_TESTS}")

target_link_libraries (${PROJECT_NAME} data ${Boost_LIBRARIES})
target_compile_features (${PROJECT_NAME} PUBLIC cxx_std_17)

I define the BOOST_TEST_MODULE in file stdafx.cpp:

#define BOOST_TEST_MODULE DataTest

#include "stdafx.hpp"

And then I define the name of test suite in test files, for example:

#include "stdafx.hpp"
#include "Data/LLA.hpp"

BOOST_AUTO_TEST_SUITE(LLATest);

BOOST_AUTO_TEST_CASE(DefaultConstructor) {
  Data::LLA lla;
  BOOST_CHECK_EQUAL(lla.getLatitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getLongitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getAltitude(), 0.0);
}

BOOST_AUTO_TEST_CASE(ValueConstructor) {
  double lat{ 0.3 };
  double lon{ 0.5 };
  double alt{ 93 };
  Data::LLA lla(lat, lon, alt);
  BOOST_CHECK_EQUAL(lla.getLatitude(), lat);
  BOOST_CHECK_EQUAL(lla.getLongitude(), lon);
  BOOST_CHECK_EQUAL(lla.getAltitude(), alt);
}

BOOST_AUTO_TEST_CASE(SetLatitude) {
  Data::LLA lla;
  double angle{ 0.5 };
  lla.setLatitude(angle);
  BOOST_CHECK_EQUAL(lla.getLatitude(), angle);
  BOOST_CHECK_EQUAL(lla.getLongitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getAltitude(), 0.0);
}

BOOST_AUTO_TEST_CASE(SetLongitude) {
  Data::LLA lla;
  double angle{ 0.5 };
  lla.setLongitude(angle);
  BOOST_CHECK_EQUAL(lla.getLatitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getLongitude(), angle);
  BOOST_CHECK_EQUAL(lla.getAltitude(), 0.0);
}

BOOST_AUTO_TEST_CASE(SetAltitude) {
  Data::LLA lla;
  double altitude{ 0.5 };
  lla.setAltitude(altitude);
  BOOST_CHECK_EQUAL(lla.getLatitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getLongitude(), 0.0);
  BOOST_CHECK_EQUAL(lla.getAltitude(), altitude);
}

BOOST_AUTO_TEST_SUITE_END();

What I can see is that the Test explorer windows works, but not too well.

Even if I can see and run tests from Test explorer, I can't see them in the proper way, since Class Name and Namespace fields are not defined, like in following screenshot:

enter image description here

So, I'd like to know how can I fill the namespace and class name fields in the proper way. What I'm doing wrong?

Jepessen
  • 11,744
  • 14
  • 82
  • 149
  • 1
    Did you found a solution to this problem? I’m using ctest with Boost::test and never found the test explorer view to be working (as showing namespaces and classes) – Hhut Mar 26 '21 at 09:04
  • 1
    No, it's still the same. At least they works... – Jepessen Mar 30 '21 at 10:34
  • Same problem here. It's reported under the Test Adapter for Google Test. https://developercommunity.visualstudio.com/t/test-explorer-namespace-seems-to-not-be-working/663974 – gast128 Oct 27 '22 at 11:16

0 Answers0