Solved Qt Unit test in a project
-
Thank for the answers !
@jsulm
Why should I include the cpp file instead of the header which are the file we usualy use to reuse function from another class ? Is that because it is a different project ?@sierdzio
Ok, what do you think about my idea of keeping only one tests project with multiple cpp file corresponding to each class I want to test ? -
@DavidM29 said in Qt Unit test in a project:
Why should I include the cpp file instead of the header which are the file we usualy use to reuse function from another class ? Is that because it is a different project ?
Because you want to test the code there, right? Your test will be an executable and header file alone is not enough (you will get "Undefined symbol" linker errors, just try).
-
@DavidM29 said in Qt Unit test in a project:
Thank for the answers !
@jsulm
Why should I include the cpp file instead of the header which are the file we usualy use to reuse function from another class ? Is that because it is a different project ?C++ compiler needs to compile your class to use it in a test. And in order to compile, it needs the cpp file.
@sierdzio
Ok, what do you think about my idea of keeping only one tests project with multiple cpp file corresponding to each class I want to test ?Sounds good.
-
Thank you to all of you it seems that I'm all set. My first try seems to works nicely.
-
Nice! Happy coding :-)
-
I want to do the same thing but for CMAKE project. Anyone have idea? @sierdzio
-
@HemantSuryawanshi said in Qt Unit test in a project:
I want to do the same thing but for CMAKE project. Anyone have idea? @sierdzio
include(CTest) add_subdirectory(tests) enable_testing()
:-) You can see some example code here: https://github.com/milosolutions/mwizardtemplate/blob/master/CMakeLists.txt
-
I did all the things that you guys suggested and create a subdirectory project using CMake build system. Project is created successfully and then I create a class name Calculator in my src project. Now I am trying to access the methods from Calculator class into tests project to perform unit testing. But the compiler not able to find that methods in Calculator class.
I also added following line for linking purpose, but still its not workingtarget_include_directories(UnitTest PRIVATE ${CMAKE_SOURCE_DIR}/src)
The compiler giving me following errors,
tests/CMakeFiles/UnitTest.dir/tst_unittest.cpp.obj: In function `UnitTest::test_add()': C:/Hemant/Unit_Testing/Testing_subdir/tests/tst_unittest.cpp:31: undefined reference to `Calculator::Calculator(QObject*)' C:/Hemant/Unit_Testing/Testing_subdir/tests/tst_unittest.cpp:32: undefined reference to `Calculator::add(int, int)' tests/CMakeFiles/UnitTest.dir/tst_unittest.cpp.obj:tst_unittest.cpp:(.rdata$.refptr._ZTV10Calculator[.refptr._ZTV10Calculator]+0x0): undefined reference to `vtable for Calculator'
Did I need to add something extra for the linking of these two subdirectories in my CMakeLists.txt files . Please help @sierdzio @jsulm
-
@HemantSuryawanshi said in Qt Unit test in a project:
Did I need to add something extra for the linking of these two subdirectories in my CMakeLists.txt files
You need to add source files (*.cpp) you want to test.
As you can see from the errors you are missing the source file containing Calculator definition. -
@jsulm are you trying to say that I also need to add the calculator class into tests project? I already have the Calculator class implemented into src project.
-
@HemantSuryawanshi said in Qt Unit test in a project:
are you trying to say that I also need to add the calculator class into tests project?
No, you need to add a reference to that file to your test project, something like:
add_executable(${PROJECT_NAME} PATH_TO/calculator.cpp tst_unittest.cpp ... )
If the code you want to test compiles to a lib you could instead add a dependency to this lib.
-
@jsulm Its working now. Thanks for response
-
Hi, I also want to include Qt Quick Test in same project. I added required directives into project. but I have one problem that I already have the main definition and it will not take another main definition. Please tell me how cam I add
QUICK_TEST_MAIN(example)
this code into main function? @jsulm
-
@HemantSuryawanshi said in Qt Unit test in a project:
I have one problem that I already have the main definition
Are you trying to test a cpp file containing main()?
Why?
There should not be anything to test. If there is something you want to test, then move that functionality in functions/methods outside of that source file. -
@jsulm No I want to test qml file which is present in my src project. And I want to integrate both cpp testing and qml testing into in single project which is tests. thats why I want to integrate that macro in main function. How can I do that, any idea?
-
@HemantSuryawanshi said in Qt Unit test in a project:
How can I do that, any idea?
Make sure you have only one main() in your test project.
-
#include <QtTest> #include <QDebug> #include <tst_unittest.cpp> #include <tst_userdata.cpp> #include <QtQuickTest/quicktest.h> QUICK_TEST_MAIN(example) int main(int argc, char** argv) { int failedTests = 0; failedTests += QTest::qExec(new UnitTest, argc, argv); failedTests += QTest::qExec(new TestUserData, argc, argv); if(failedTests > 0){ qDebug() << "total number of failed tests: " << failedTests; }else{ qDebug() << "all tests passed :)"; } return failedTests; }
This is my main file. My project contains multiple unit tests including Qt test and Qt Quick test. In this I am getting error that redefinition of main function due to the QUICK_TEST_MAIN Macro.
-
@HemantSuryawanshi said in Qt Unit test in a project:
I am getting error that redefinition of main function due to the QUICK_TEST_MAIN Macro
Of course, you have two main() functions now.
I suggest you split your C++ and Qt Quick tests. -
@jsulm how can I link the qml file to the Qt Quick test project. I tried with same way as I link cpp file earlier, but its not working.