Qt Unit test in a project
-
How did you made the tests .pro file ? Did you create a separated project ? Did you made it enterily yourself ?
The .pro files are kind of a dark zone to me I never made any change on them and don't really know how it works.
I do have the equivalent of the app dir at the moment.
Should I make 2 new projects ? like one for the master and one for the tests ? How do I merge 2 project into one ?"To get easier access to same defines, files etc. in both subprojects, you can put the common definitions in a .pri file, that you then include in project files." Can you explain me a bit more on this ? I don't know what is a .pri file and I found 2 of them in your project without understanding them.
That is lot of questions... Sorry about that but I would like to implement test like you did. It seems to be close to Java unit tests.
I don't want to have a separate project where I duplicate my classes to make some tests with. I feel like it is very wrong to do that.The .pro files are kind of a dark zone
They are just plain text files, they don't bite :-)
Seriously, you can create them from Qt Creator as general files, or create them externally with your favorite editor and place them in the proper/expected folder.
You may want to read about project files with qmake.
-
How did you made the tests .pro file ? Did you create a separated project ? Did you made it enterily yourself ?
The .pro files are kind of a dark zone to me I never made any change on them and don't really know how it works.
I do have the equivalent of the app dir at the moment.
Should I make 2 new projects ? like one for the master and one for the tests ? How do I merge 2 project into one ?"To get easier access to same defines, files etc. in both subprojects, you can put the common definitions in a .pri file, that you then include in project files." Can you explain me a bit more on this ? I don't know what is a .pri file and I found 2 of them in your project without understanding them.
That is lot of questions... Sorry about that but I would like to implement test like you did. It seems to be close to Java unit tests.
I don't want to have a separate project where I duplicate my classes to make some tests with. I feel like it is very wrong to do that.@DavidM29 said in Qt Unit test in a project:
How did you made the tests .pro file ? Did you create a separated project ? Did you made it enterily yourself ?
Yes, hand made.
The .pro files are kind of a dark zone to me I never made any change on them and don't really know how it works.
You should learn the syntax, and you should get to know them more. Keeping good project files is just as important part of C++ programming as writing the C++ code itself.
While you're at it, it is also good to learn cmake, as it has become the de facto standard in C++ world. That one I need to learn myself, too, finally.
I do have the equivalent of the app dir at the moment.
Should I make 2 new projects ? like one for the master and one for the tests ? How do I merge 2 project into one ?Unfortunately the answer is "doesn't matter" ;-) No matter how you do it, what matters is the result. I recommend writing them by hand. If you currently have your main application project file, then this is super easy. Do this:
- close Qt Creator
- remove .pro.user file from your code directory
- add new dir:
app
and move your whole project there - rename
app/yourProject.pro
toapp/app.pro
- add new main file in your root dir:
yourProject.pro
- in that file, paste the code I wrote in my previous post
- open
yourProject.pro
in Qt Creator
That's it. You now have a working subdirs project and you can start adding tests. Not sure, maybe even from within Qt Creator (I can't check now).
"To get easier access to same defines, files etc. in both subprojects, you can put the common definitions in a .pri file, that you then include in project files." Can you explain me a bit more on this ? I don't know what is a .pri file and I found 2 of them in your project without understanding them.
Since you say you don't know how regular .pro files work, you won't understand anything about .pri files either. The closest (and quite bad) analogy I can draw for you is that .pri is like a header file in C++: you can include it in many source files (.pro) and thus avoid copy pasting.
I suggest taking a look at your .pro files and trying to make sense of them. Or reading about qmake in some book (or documentation), then things will become clear quickly. qmake syntax is not hard at all.
That is lot of questions... Sorry about that but I would like to implement test like you did. It seems to be close to Java unit tests.
I don't want to have a separate project where I duplicate my classes to make some tests with. I feel like it is very wrong to do that.Yep.
-
@DavidM29 said in Qt Unit test in a project:
How did you made the tests .pro file ? Did you create a separated project ? Did you made it enterily yourself ?
Yes, hand made.
The .pro files are kind of a dark zone to me I never made any change on them and don't really know how it works.
You should learn the syntax, and you should get to know them more. Keeping good project files is just as important part of C++ programming as writing the C++ code itself.
While you're at it, it is also good to learn cmake, as it has become the de facto standard in C++ world. That one I need to learn myself, too, finally.
I do have the equivalent of the app dir at the moment.
Should I make 2 new projects ? like one for the master and one for the tests ? How do I merge 2 project into one ?Unfortunately the answer is "doesn't matter" ;-) No matter how you do it, what matters is the result. I recommend writing them by hand. If you currently have your main application project file, then this is super easy. Do this:
- close Qt Creator
- remove .pro.user file from your code directory
- add new dir:
app
and move your whole project there - rename
app/yourProject.pro
toapp/app.pro
- add new main file in your root dir:
yourProject.pro
- in that file, paste the code I wrote in my previous post
- open
yourProject.pro
in Qt Creator
That's it. You now have a working subdirs project and you can start adding tests. Not sure, maybe even from within Qt Creator (I can't check now).
"To get easier access to same defines, files etc. in both subprojects, you can put the common definitions in a .pri file, that you then include in project files." Can you explain me a bit more on this ? I don't know what is a .pri file and I found 2 of them in your project without understanding them.
Since you say you don't know how regular .pro files work, you won't understand anything about .pri files either. The closest (and quite bad) analogy I can draw for you is that .pri is like a header file in C++: you can include it in many source files (.pro) and thus avoid copy pasting.
I suggest taking a look at your .pro files and trying to make sense of them. Or reading about qmake in some book (or documentation), then things will become clear quickly. qmake syntax is not hard at all.
That is lot of questions... Sorry about that but I would like to implement test like you did. It seems to be close to Java unit tests.
I don't want to have a separate project where I duplicate my classes to make some tests with. I feel like it is very wrong to do that.Yep.
-
@sierdzio
Hi,I'm done with the project architecture I think. Here is what I have :
My project : |- MyProject.pro | - app |- Headers | classToTest.h | ... | ... |- Sources | classToTest.cpp | ... | ... |- Resources |- font.qrc |- image.qrc |- qml.qrc | - tests |- test.pro |- Sources |- testOne.cpp
Is that all good ? (I believe it is I'm able to launch the app properly)
Now I wonder how should I include the "classToTest.h" inside my testOne.cpp in order to test all the methods of that class.
Can you please help me with this ?PS : I took a look at how you did it on your timeline project and I saw that you made a test project for each class you test. Is that a good practice, you personal choice ? Can I have only the tests project where I have a cpp dedicated to each class I want to test ?
Thank you in advance
-
@sierdzio
Hi,I'm done with the project architecture I think. Here is what I have :
My project : |- MyProject.pro | - app |- Headers | classToTest.h | ... | ... |- Sources | classToTest.cpp | ... | ... |- Resources |- font.qrc |- image.qrc |- qml.qrc | - tests |- test.pro |- Sources |- testOne.cpp
Is that all good ? (I believe it is I'm able to launch the app properly)
Now I wonder how should I include the "classToTest.h" inside my testOne.cpp in order to test all the methods of that class.
Can you please help me with this ?PS : I took a look at how you did it on your timeline project and I saw that you made a test project for each class you test. Is that a good practice, you personal choice ? Can I have only the tests project where I have a cpp dedicated to each class I want to test ?
Thank you in advance
@DavidM29 said in Qt Unit test in a project:
Now I wonder how should I include the "classToTest.h" inside my testOne.cpp
You need to set http://doc.qt.io/qt-5/qmake-variable-reference.html#includepath in your test.pro
But this is not enough - you will need to add the cpp file as well (http://doc.qt.io/qt-5/qmake-variable-reference.html#sources) -
@sierdzio
Hi,I'm done with the project architecture I think. Here is what I have :
My project : |- MyProject.pro | - app |- Headers | classToTest.h | ... | ... |- Sources | classToTest.cpp | ... | ... |- Resources |- font.qrc |- image.qrc |- qml.qrc | - tests |- test.pro |- Sources |- testOne.cpp
Is that all good ? (I believe it is I'm able to launch the app properly)
Now I wonder how should I include the "classToTest.h" inside my testOne.cpp in order to test all the methods of that class.
Can you please help me with this ?PS : I took a look at how you did it on your timeline project and I saw that you made a test project for each class you test. Is that a good practice, you personal choice ? Can I have only the tests project where I have a cpp dedicated to each class I want to test ?
Thank you in advance
@DavidM29 said in Qt Unit test in a project:
I saw that you made a test project for each class you test. Is that a good practice, you personal choice ?
These don't necessarily exclude each other ;-)
It is my choice. Makes management of all these test subprojects a nightmare (a clear drawback), but it also keeps all components clearly separate (so for example if I were to remove a single class, it's trivial to remove the test as well). Also, it nicely coincides with "unit" part in "unit testing" - each element is tested as a separate entity. Which in turn helps to structure the code so that is is not heavily dependent on other classes and does not evolve into a spaghetti. Also, it plays nice with Qt Creator automated test runner.
I don't know if it is the best solution, probably not.
-
@DavidM29 said in Qt Unit test in a project:
Now I wonder how should I include the "classToTest.h" inside my testOne.cpp
You need to set http://doc.qt.io/qt-5/qmake-variable-reference.html#includepath in your test.pro
But this is not enough - you will need to add the cpp file as well (http://doc.qt.io/qt-5/qmake-variable-reference.html#sources)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 ? -
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).
-
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:
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.
-
Nice! Happy coding :-)
-
I want to do the same thing but for CMAKE project. Anyone have idea? @sierdzio
-
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
-
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.
-
@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
-
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.