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.2k 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 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