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 4.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.
  • Christian EhrlicherC Online
    Christian EhrlicherC Online
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #6

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

    How can I run it with Cmake on build?

    You don't run autotests on build but afterwards with e.g. 'make test' or in a jenkins job.
    See also CMake documentation about add_test()

    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
    Visit the Qt Academy at https://academy.qt.io/catalog

    J 1 Reply Last reply
    3
    • Christian EhrlicherC Christian Ehrlicher

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

      How can I run it with Cmake on build?

      You don't run autotests on build but afterwards with e.g. 'make test' or in a jenkins job.
      See also CMake documentation about add_test()

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

      @Christian-Ehrlicher
      Hmm, so what exactly would I need to start automated testing?
      Coming from a Java and JUnit background, all I had to do was make a test class, and I could create a test configuration and run that and all the tests in the test class would run whenever I liked. Is this possible with Qt Test?

      1 Reply Last reply
      0
      • VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by
        #8

        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

        "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
        2
        • 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