Contrôle de la sortie du format d'emplacement source Boost.Test
Catch2 et Boost.Test fournissent des fonctionnalités similaires pour l'écriture de tests unitaires. Pour un certain projet, je dois utiliser Boost.Test au lieu de Catch2. Le problème que j'ai est que les deux utilisent des sorties de format différent.
Par exemple, Catch2 dira que c'était un échec dans
test.cpp:9
(voir l'exemple ci-dessous). Cependant, Boost.Test dira
test.cpp(9): error in ....
Ce format ne permet pas à mon éditeur de reconnaître la sortie comme un emplacement source.
Existe-t-il un moyen de faire en sorte que Boost.Test affiche l'emplacement source au file.ext:linenolieu de file.ext(lineno)?
Ceci est une sortie typique pour Catch2
----------------------------------------------
Testing Binary Search
----------------------------------------------
test.cpp:9
..............................................test.cpp:18: FAILED:
REQUIRE( binary_search(arr, 176) == 0 )
with expansion:
-1 == 0==============================================
test cases: 1 | 1 failed
assertions: 5 | 4 passed | 1 failed
Il s'agit d'une sortie typique pour Boost.
Running 7 test cases...
./layout.hpp(764): error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
Running 7 test cases...
./.././detail/layout.hpp(764): error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
*** 1 failure is detected in the test module "C++ Unit Tests for Multi layout"
Réponses
J'ai trouvé une solution dans ce post historique: https://richarddingwall.name/2008/06/01/using-the-boost-unit-test-framework-with-xcode-3
Utilisation de l'art (perdu de) du remplacement de fonction virtuelle et du Boost.
Ajoutez simplement ce code (quelques mises à jour de l'article d'origine, avec des formats mineurs et des mises à jour C ++ 11):
#include<boost/test/output/compiler_log_formatter.hpp>
struct xcode_log_formatter: boost::unit_test::output::compiler_log_formatter{
// Produces an Xcode-friendly message prefix.
void print_prefix(std::ostream& output, boost::unit_test::const_string file_name, std::size_t line) override{
output << file_name << ':' << line << ": error: ";
}
};
// Set up the unit test framework to use an xcode-friendly log formatter.
struct xcode_config{
xcode_config(){boost::unit_test::unit_test_log.set_formatter(new xcode_log_formatter);}
};
// Call our fixture.
BOOST_GLOBAL_FIXTURE(xcode_config);
avec ce changement, la sortie ressemble à (fichier note: format lineno).
Running 7 test cases...
./layout.hpp:781: error: error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
Running 7 test cases...
./.././detail/layout.hpp:781: error: error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
Je suis toujours intéressé par des solutions plus simples.
Voici une version plus compacte de ce code, renommée pour mon propre cas (xcode-> gedit):
#include<boost/test/output/compiler_log_formatter.hpp>
struct gedit_config{
struct formatter : boost::unit_test::output::compiler_log_formatter{
void print_prefix(std::ostream& out, boost::unit_test::const_string file, std::size_t line){
out<< file <<':'<< line <<": ";
}
};
gedit_config(){boost::unit_test::unit_test_log.set_formatter(new formatter);}
};
BOOST_GLOBAL_FIXTURE(gedit_config);