Utiliser Boost.Test pour C++ dans Visual Studio

Dans Visual Studio 2017 et versions ultérieures, l’adaptateur de test Boost.Test est intégré à l’IDE Visual Studio. Il s’agit d’un composant de la charge de travail Développement de bureau avec C++.

Adaptateur de test pour Boost.Test

Si la charge de travail Développement Desktop en C++ n’est pas installée, ouvrez Visual Studio Installer. Sélectionnez la charge de travail Développement Desktop en C++, puis choisissez le bouton Modifier.

Installer Boost

Boost.Test nécessite Boost! Si Boost n’est pas installé, nous vous recommandons d’utiliser le gestionnaire de package Vcpkg.

  1. Suivez les instructions de Vcpkg : un gestionnaire de package C++ pour Windows pour installer vcpkg (si vous ne l’avez pas déjà).

  2. Installez la bibliothèque dynamique ou statique de Boost.Test :

    • Exécutez vcpkg install boost-test pour installer la bibliothèque dynamique de Boost.Test.

      -ou-

    • Exécutez vcpkg install boost-test:x86-windows-static pour installer la bibliothèque statique de Boost.Test.

  3. Exécutez vcpkg integrate install pour configurer Visual Studio avec la bibliothèque et inclure les chemins des fichiers d’en-tête et des fichiers binaires de Boost.

Vous avez le choix de configurer vos tests dans votre solution dans Visual Studio : vous pouvez ajouter votre code de test dans le projet testé, ou vous pouvez créer un projet de test distinct pour vos tests. Les deux choix présentent des avantages et des inconvénients.

Ajouter des tests dans votre projet

Dans Visual Studio 2017 version 15.6 et ultérieures, vous pouvez ajouter un modèle d’élément pour les tests dans votre projet. Les tests et le code publié sont tous deux dans le même projet. Vous devez créer une configuration de build distincte pour générer une build de test. De plus, vous devez exclure les tests de vos builds Debug et Release.

Dans Visual Studio 2017 version 15.5, aucun modèle de projet ou d’élément de test préconfiguré n’est disponible pour Boost.Test. Utilisez les instructions pour créer et configurer un projet de test distinct.

Créer un élément Boost.Test

  1. Pour créer un fichier .cpp à des fins de tests, cliquez avec le bouton droit sur le nœud du projet dans l’Explorateur de solutions, puis choisissez Ajouter>Nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, développezInstallé>Visual C++>Test. Sélectionnez Boost.Test, puis choisissez Ajouter pour ajouter Test.cpp à votre projet.

    Modèle d’élément Boost.Test

Le nouveau fichier Test.cpp contient un exemple de méthode de test. Dans ce fichier, vous pouvez ajouter vos propres fichiers d’en-tête et écrire des tests pour votre application.

Le fichier de test utilise également des macros afin de définir une nouvelle routine main pour les configurations de test. Si vous générez votre projet maintenant, vous voyez une erreur LNK2005, de type « _main déjà défini dans main.obj ».

Créer et mettre à jour des configurations de build

  1. Pour créer une configuration de test, dans la barre de menus, sélectionnez Générer>Gestionnaire de configuration. Dans la boîte de dialogue Gestionnaire de configuration, ouvrez la liste déroulante sous Configuration de la solution active et choisissez Nouveau. Dans la boîte de dialogue Nouvelle configuration de solution, entrez un nom comme « Debug UnitTests ». Sous Copier les paramètres à partir de, sélectionnez Debug et choisissez OK.

  2. Exclure le code de test de vos configurations Debug et Release : dans l’Explorateur de solutions, cliquez avec le bouton droit sur Test.cpp et sélectionnez Propriétés. Dans la boîte de dialogue Pages de propriétés, sélectionnez Toutes les configurations dans la liste déroulante Configuration. Sélectionnez Propriétés de configuration>Général et ouvrez la liste déroulante de la propriété Exclu de la génération. Sélectionnez Oui, puis choisissez Appliquer pour enregistrer vos changements.

  3. Pour ajouter le code de test dans votre configuration Debug UnitTests, dans la boîte de dialogue Pages de propriétés, sélectionnez Debug UnitTests dans la liste déroulante Configuration. Sélectionnez Non dans la propriété Exclu de la génération, puis choisissez OK pour enregistrer vos changements.

  4. Excluez le code principal de votre configuration Debug UnitTests. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le fichier qui contient votre fonction main, puis sélectionnez Propriétés. Dans la boîte de dialogue Pages de propriétés, sélectionnez Debug UnitTests dans la liste déroulante Configuration. Sélectionnez Propriétés de configuration>Général et ouvrez la liste déroulante de la propriété Exclu de la génération. Sélectionnez Oui, puis choisissez OK pour enregistrer vos changements.

  5. Définissez Configuration de la solution sur Debug UnitTests, puis générez votre projet pour permettre à l’Explorateur de tests de découvrir la méthode.

Quand le nom de la configuration que vous créez commence par les mots « Debug » ou « Release », les bibliothèques Boost.Test correspondantes sont récupérées automatiquement.

Le modèle d’élément utilise la variante à en-tête unique de Boost.Test, mais vous pouvez modifier le chemin d’accès #include pour utiliser la variante avec bibliothèque autonome. Pour plus d’informations, consultez la section Ajouter des directives include.

Créer un projet de test distinct

Dans de nombreux cas, il est plus facile d’utiliser un projet distinct pour vos tests. Vous n’avez pas besoin de créer une configuration de test spéciale pour votre projet. Vous pouvez également exclure les fichiers de test des builds Debug et Release.

Pour créer un projet de test distinct

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud de la solution et choisissez Ajouter>Nouveau projet.

  2. Dans la boîte de dialogue Ajouter un nouveau projet, choisissez C++, Windows et Console dans les listes déroulantes de filtre. Sélectionnez le modèle Application console, puis choisissez Suivant.

  3. Nommez le projet et choisissez Créer.

  4. Supprimez la fonction main dans le fichier .cpp.

  5. Si vous utilisez la version avec un seul en-tête ou la version de bibliothèque dynamique de Boost.Test, accédez à Ajouter des directives include. Si vous utilisez la version de bibliothèque statique, vous devez faire une configuration supplémentaire :

    a. Pour modifier le fichier projet, commencez par le décharger. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet et choisissez Décharger le projet. Ensuite, cliquez avec le bouton droit sur le nœud du projet et choisissez Modifier <name>.vcxproj.

    b. Ajouter deux lignes au groupe de propriétés Globals comme indiqué ici :

    <PropertyGroup Label="Globals">
    ....
        <VcpkgTriplet>x86-windows-static</VcpkgTriplet>
        <VcpkgEnabled>true</VcpkgEnabled>
    </PropertyGroup>
    

    c. Enregistrez et fermez le fichier *.vcxproj, puis rechargez le projet.

    d. Pour ouvrir les pages de propriétés, cliquez avec le bouton droit sur le nœud du projet et choisissez Propriétés.

    e. Développez C/C++>Génération de code, puis sélectionnez Bibliothèque Runtime. Sélectionnez /MTd pour une bibliothèque runtime statique de débogage ou /MT pour une bibliothèque runtime statique de publication.

    f. Développez Éditeur de liens>Système. Vérifiez que Sous-système est défini sur Console.

    g. Choisissez OK pour fermer les pages de propriétés.

Ajouter des directives include

  1. Dans le fichier .cpp de test, ajoutez les directives #include nécessaires pour rendre les types et les fonctions de votre programme visibles par le code de test. Si vous utilisez un projet de test distinct, en général, le programme se trouve à un niveau frère dans la hiérarchie des dossiers. Si vous tapez #include "../", une fenêtre IntelliSense apparaît et vous permet de sélectionner le chemin complet du fichier d’en-tête.

    Ajouter des directives #include

    Vous pouvez utiliser la bibliothèque autonome avec :

    #include <boost/test/unit_test.hpp>
    

    Ou bien, utilisez la version à un seul en-tête avec :

    #include <boost/test/included/unit_test.hpp>
    

    Ensuite, définissez BOOST_TEST_MODULE.

L’exemple suivant est suffisant pour que le test soit découvrable dans l’Explorateur de tests :

#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp> //single-header
#include "../MyProgram/MyClass.h" // project being tested
#include <string>

BOOST_AUTO_TEST_CASE(my_boost_test)
{
    std::string expected_value = "Bill";

    // assume MyClass is defined in MyClass.h
    // and get_value() has public accessibility
    MyClass mc;
    BOOST_CHECK(expected_value == mc.get_value());
}

Écrire et exécuter des tests

Vous êtes maintenant prêt à écrire et à exécuter des tests Boost. Pour plus d’informations sur les macros de test, consultez la documentation de la bibliothèque de tests Boost. Pour plus d’informations sur la découverte, l’exécution et le regroupement de vos tests avec l’Explorateur de tests, consultez Exécuter des tests unitaires avec l’Explorateur de tests.