Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to add tests to an existing project?
Forum Updated to NodeBB v4.3 + New Features

How to add tests to an existing project?

Scheduled Pinned Locked Moved Solved General and Desktop
qt testgoogle testtesting
19 Posts 4 Posters 5.7k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • VRoninV VRonin

    If your are using CMake, the workflow is:

    • call cmake
      • this crates the makefile/projectfile that the compiler/linker can digest
    • call make (cmake --build . for convenience)
      • to actually build the projects
    • call ctest
      • this will run the tests that you added with add_test(). You can run specific tests by specifying the -r name_of_the_test argument
    J Offline
    J Offline
    jkwok678
    wrote on last edited by jkwok678
    #9

    @VRonin
    Am I able to run any test I want at any time?
    E.g. All of the unit tests or just 1 of them ?
    Is it doable like Java and Junit in the Intelij IDE?
    What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.
    Also would just 1 test project be enough be multiple cpp test files?
    It seems a little messy in terms of project structure to have 1 auto test project for each class/file?

    I imagined my test structure to be a little like

    MyProject/tests/QtTests/
    

    And inside here I can have a windowTest.cpp, canvasTest.cpp andmapTest.cpp. Along with a CMakeLists.txt.
    But when I tried to create mutltiple test projects, it's more like

    MyProject/tests/QtTests/WidowClassTest
    MyProject/tests/QtTests/CanvasClassTest
    MyProject/tests/QtTests/MapClassTest
    

    Each with their own ___Test.cpp and a CMakeLists.txt.
    Is the 2nd way of doing things better?

    VRoninV 1 Reply Last reply
    0
    • J jkwok678

      @VRonin
      Am I able to run any test I want at any time?
      E.g. All of the unit tests or just 1 of them ?
      Is it doable like Java and Junit in the Intelij IDE?
      What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.
      Also would just 1 test project be enough be multiple cpp test files?
      It seems a little messy in terms of project structure to have 1 auto test project for each class/file?

      I imagined my test structure to be a little like

      MyProject/tests/QtTests/
      

      And inside here I can have a windowTest.cpp, canvasTest.cpp andmapTest.cpp. Along with a CMakeLists.txt.
      But when I tried to create mutltiple test projects, it's more like

      MyProject/tests/QtTests/WidowClassTest
      MyProject/tests/QtTests/CanvasClassTest
      MyProject/tests/QtTests/MapClassTest
      

      Each with their own ___Test.cpp and a CMakeLists.txt.
      Is the 2nd way of doing things better?

      VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #10

      @jkwok678 said in How to add tests to an existing project?:

      E.g. All of the unit tests or just 1 of them ?
      Is it doable like Java and Junit in the Intelij IDE?

      In Qt Creator in the top left corner expand the combobox that says "projects" and select tests to run them

      What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.

      No as far as I'm aware

      It seems a little messy in terms of project structure to have 1 auto test project for each class/file?
      Is the 2nd way of doing things better?

      Qt Test is designed to be used 1-project-per-test. You can build around it but, believe me, the results are sub-par.

      But when I tried to create mutltiple test projects, it's more like
      MyProject/tests/QtTests/WidowClassTest
      MyProject/tests/QtTests/CanvasClassTest
      MyProject/tests/QtTests/MapClassTest

      Folder structure has nothing to do with projects.
      To test classes Window, Canvas and Map, you can create a folder structure like:

      • MyProject
        • tests
          • tst_window.cpp
          • tst_canvas.cpp
          • tst_map.cpp
          • CMakeLists.txt

      and the content of CMakeLists.txt would be:

      cmake_minimum_required(VERSION 3.9)
      find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test REQUIRED)
      find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test Gui Widgets REQUIRED)
      
      macro(BasicTest TestName)
          set(targetName "tst_${TestName}")
          set(testProjectName "tst${TestName}")
          string(TOLOWER ${TestName} TestSourceFileName)
          add_executable(${targetName} "tst_${TestSourceFileName}.cpp")
          target_include_directories(${targetName} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
          target_link_libraries(${targetName} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets)
          set_target_properties(${targetName} PROPERTIES
              AUTOMOC ON
              AUTOUIC ON
              AUTORCC ON
              CXX_STANDARD 11
              CXX_STANDARD_REQUIRED ON
          )
          add_test(NAME ${testProjectName} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND $<TARGET_FILE:${targetName}>)
      endmacro()
      
      BasicTest(Window)
      BasicTest(Canvas)
      BasicTest(Map)
      

      To add more tests just add 1 line at the end

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      J VRoninV 3 Replies Last reply
      2
      • VRoninV VRonin

        @jkwok678 said in How to add tests to an existing project?:

        E.g. All of the unit tests or just 1 of them ?
        Is it doable like Java and Junit in the Intelij IDE?

        In Qt Creator in the top left corner expand the combobox that says "projects" and select tests to run them

        What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.

        No as far as I'm aware

        It seems a little messy in terms of project structure to have 1 auto test project for each class/file?
        Is the 2nd way of doing things better?

        Qt Test is designed to be used 1-project-per-test. You can build around it but, believe me, the results are sub-par.

        But when I tried to create mutltiple test projects, it's more like
        MyProject/tests/QtTests/WidowClassTest
        MyProject/tests/QtTests/CanvasClassTest
        MyProject/tests/QtTests/MapClassTest

        Folder structure has nothing to do with projects.
        To test classes Window, Canvas and Map, you can create a folder structure like:

        • MyProject
          • tests
            • tst_window.cpp
            • tst_canvas.cpp
            • tst_map.cpp
            • CMakeLists.txt

        and the content of CMakeLists.txt would be:

        cmake_minimum_required(VERSION 3.9)
        find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test REQUIRED)
        find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test Gui Widgets REQUIRED)
        
        macro(BasicTest TestName)
            set(targetName "tst_${TestName}")
            set(testProjectName "tst${TestName}")
            string(TOLOWER ${TestName} TestSourceFileName)
            add_executable(${targetName} "tst_${TestSourceFileName}.cpp")
            target_include_directories(${targetName} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
            target_link_libraries(${targetName} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets)
            set_target_properties(${targetName} PROPERTIES
                AUTOMOC ON
                AUTOUIC ON
                AUTORCC ON
                CXX_STANDARD 11
                CXX_STANDARD_REQUIRED ON
            )
            add_test(NAME ${testProjectName} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND $<TARGET_FILE:${targetName}>)
        endmacro()
        
        BasicTest(Window)
        BasicTest(Canvas)
        BasicTest(Map)
        

        To add more tests just add 1 line at the end

        J Offline
        J Offline
        jkwok678
        wrote on last edited by
        #11

        @VRonin said in How to add tests to an existing project?:

        BasicTest(Window)

        What's that?
        Is that the class name in tst_window.cpp?

        1 Reply Last reply
        0
        • VRoninV VRonin

          @jkwok678 said in How to add tests to an existing project?:

          E.g. All of the unit tests or just 1 of them ?
          Is it doable like Java and Junit in the Intelij IDE?

          In Qt Creator in the top left corner expand the combobox that says "projects" and select tests to run them

          What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.

          No as far as I'm aware

          It seems a little messy in terms of project structure to have 1 auto test project for each class/file?
          Is the 2nd way of doing things better?

          Qt Test is designed to be used 1-project-per-test. You can build around it but, believe me, the results are sub-par.

          But when I tried to create mutltiple test projects, it's more like
          MyProject/tests/QtTests/WidowClassTest
          MyProject/tests/QtTests/CanvasClassTest
          MyProject/tests/QtTests/MapClassTest

          Folder structure has nothing to do with projects.
          To test classes Window, Canvas and Map, you can create a folder structure like:

          • MyProject
            • tests
              • tst_window.cpp
              • tst_canvas.cpp
              • tst_map.cpp
              • CMakeLists.txt

          and the content of CMakeLists.txt would be:

          cmake_minimum_required(VERSION 3.9)
          find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test REQUIRED)
          find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test Gui Widgets REQUIRED)
          
          macro(BasicTest TestName)
              set(targetName "tst_${TestName}")
              set(testProjectName "tst${TestName}")
              string(TOLOWER ${TestName} TestSourceFileName)
              add_executable(${targetName} "tst_${TestSourceFileName}.cpp")
              target_include_directories(${targetName} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
              target_link_libraries(${targetName} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets)
              set_target_properties(${targetName} PROPERTIES
                  AUTOMOC ON
                  AUTOUIC ON
                  AUTORCC ON
                  CXX_STANDARD 11
                  CXX_STANDARD_REQUIRED ON
              )
              add_test(NAME ${testProjectName} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND $<TARGET_FILE:${targetName}>)
          endmacro()
          
          BasicTest(Window)
          BasicTest(Canvas)
          BasicTest(Map)
          

          To add more tests just add 1 line at the end

          VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by VRonin
          #12

          @jkwok678 said in How to add tests to an existing project?:

          What's that?

          BasicTest is the macro defined in the code snippet

          @VRonin said in How to add tests to an existing project?:

          To test classes Window, Canvas and Map

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          0
          • J Offline
            J Offline
            jkwok678
            wrote on last edited by jkwok678
            #13

            @VRonin
            So is what you said earlier, with 1 test project, and 3 test files optimal?
            MyProject - tests - tst_window.cpp, tst_map.cpp, tst_canvas.cpp

            VRoninV 1 Reply Last reply
            0
            • J jkwok678

              @VRonin
              So is what you said earlier, with 1 test project, and 3 test files optimal?
              MyProject - tests - tst_window.cpp, tst_map.cpp, tst_canvas.cpp

              VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #14

              @jkwok678 said in How to add tests to an existing project?:

              So is what you said earlier, with 1 test project, and 3 test files optimal?

              This is not 1 test project. 1 CMakeLists.txt can create multiple projects, in this case I'm creating 1 project for each class to test, I'm just doing it in a single CMakeLists.txt file

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              J 1 Reply Last reply
              3
              • VRoninV VRonin

                @jkwok678 said in How to add tests to an existing project?:

                So is what you said earlier, with 1 test project, and 3 test files optimal?

                This is not 1 test project. 1 CMakeLists.txt can create multiple projects, in this case I'm creating 1 project for each class to test, I'm just doing it in a single CMakeLists.txt file

                J Offline
                J Offline
                jkwok678
                wrote on last edited by jkwok678
                #15

                @VRonin
                So everytime I want to test another class, I should create a new autotest project with Qt Creator?
                If it's not what would the process be if I wanted to test more than 1 class?

                VRoninV 1 Reply Last reply
                0
                • J jkwok678

                  @VRonin
                  So everytime I want to test another class, I should create a new autotest project with Qt Creator?
                  If it's not what would the process be if I wanted to test more than 1 class?

                  VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #16

                  @jkwok678 said in How to add tests to an existing project?:

                  So everytime I want to test another class, I should create a new autotest project with Qt Creator?

                  No. Say you now want to test the class MyClass. You'd add the file MyProject/tests/tst_myclass.cpp and append BasicTest(MyClass) to the snippet pasted above

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  J 1 Reply Last reply
                  0
                  • VRoninV VRonin

                    @jkwok678 said in How to add tests to an existing project?:

                    So everytime I want to test another class, I should create a new autotest project with Qt Creator?

                    No. Say you now want to test the class MyClass. You'd add the file MyProject/tests/tst_myclass.cpp and append BasicTest(MyClass) to the snippet pasted above

                    J Offline
                    J Offline
                    jkwok678
                    wrote on last edited by
                    #17

                    @VRonin
                    Ah, So it's like 1 auto test project when I start testing, and when I want to test more classes, just add a new MyClass.cpp file and add it to CmakeList?

                    VRoninV 1 Reply Last reply
                    0
                    • J jkwok678

                      @VRonin
                      Ah, So it's like 1 auto test project when I start testing, and when I want to test more classes, just add a new MyClass.cpp file and add it to CmakeList?

                      VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #18

                      @jkwok678 Conceptually yes (Stackoverflow would say no because the technical terms you used are not very precise but high-level you got the concept)

                      P.S.
                      If you don't want unnecessary pain in the future with cross-platform support, keep your .c/.cpp/.h,/.hpp etc files lower-case only

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply
                      0
                      • VRoninV VRonin

                        @jkwok678 said in How to add tests to an existing project?:

                        E.g. All of the unit tests or just 1 of them ?
                        Is it doable like Java and Junit in the Intelij IDE?

                        In Qt Creator in the top left corner expand the combobox that says "projects" and select tests to run them

                        What I mean is that the IDE has good support for JUnit, where I can click a button close to where I set breakpoints and run that particular test.

                        No as far as I'm aware

                        It seems a little messy in terms of project structure to have 1 auto test project for each class/file?
                        Is the 2nd way of doing things better?

                        Qt Test is designed to be used 1-project-per-test. You can build around it but, believe me, the results are sub-par.

                        But when I tried to create mutltiple test projects, it's more like
                        MyProject/tests/QtTests/WidowClassTest
                        MyProject/tests/QtTests/CanvasClassTest
                        MyProject/tests/QtTests/MapClassTest

                        Folder structure has nothing to do with projects.
                        To test classes Window, Canvas and Map, you can create a folder structure like:

                        • MyProject
                          • tests
                            • tst_window.cpp
                            • tst_canvas.cpp
                            • tst_map.cpp
                            • CMakeLists.txt

                        and the content of CMakeLists.txt would be:

                        cmake_minimum_required(VERSION 3.9)
                        find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Test REQUIRED)
                        find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Test Gui Widgets REQUIRED)
                        
                        macro(BasicTest TestName)
                            set(targetName "tst_${TestName}")
                            set(testProjectName "tst${TestName}")
                            string(TOLOWER ${TestName} TestSourceFileName)
                            add_executable(${targetName} "tst_${TestSourceFileName}.cpp")
                            target_include_directories(${targetName} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
                            target_link_libraries(${targetName} PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets)
                            set_target_properties(${targetName} PROPERTIES
                                AUTOMOC ON
                                AUTOUIC ON
                                AUTORCC ON
                                CXX_STANDARD 11
                                CXX_STANDARD_REQUIRED ON
                            )
                            add_test(NAME ${testProjectName} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND $<TARGET_FILE:${targetName}>)
                        endmacro()
                        
                        BasicTest(Window)
                        BasicTest(Canvas)
                        BasicTest(Map)
                        

                        To add more tests just add 1 line at the end

                        J Offline
                        J Offline
                        jkwok678
                        wrote on last edited by jkwok678
                        #19
                        This post is deleted!
                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved