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:
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?