Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt: How to organize Unit Test with more than one class?

I have a Qt Unit test (sub)project, which generates me one class (with the main generated by QTEST_APPLESS_MAIN).I can start this from within Qt Creator as console app.

Q: How would I add additional classes as test cases to this particular project.

  1. If these classes only have "test" slots (private Q_SLOTS), the methods are not called, but just the ones of the class with QTEST_APPLESS_MAIN
  2. Since there can be only one main(..), I cannot use QTEST_APPLESS_MAIN with more than one class in the project (is that correct?)
  3. Of course, I can manually "wire" the slots in the (additional) classes with the one class containing the main, but this is very tedious.

So what is the best way to run unit test over several classes in a unit test project?

PS: In " Using QT Unit Tests in a project - conflicting main(...) functions " a Blog is mentioned, however, I cannot download the zip describing the solution.

Qt Unit Test subproject

like image 621
Horst Walter Avatar asked Aug 30 '12 09:08

Horst Walter


People also ask

Should unit tests be in the same package?

Unit tests can be in any package. In essence they are just separate classes used to test the behaviour of the class being tested.

Can unit tests depend on each other?

Tests should never depend on each other. If your tests have to be run in a specific order, then you need to change your tests. Instead, you should make proper use of the Setup and TearDown features of your unit-testing framework to ensure each test is ready to run individually.

How many unit tests should a program have?

I write at least one test per method, and somtimes more if the method requires some different setUp to test the good cases and the bad cases. But you should NEVER test more than one method in one unit test. It reduce the amount of work and error in fixing your test in case your API changes.


1 Answers

As per the solution you linked to, the way to accomplish testing two (or more) classes within a single Qt unit test project is to ensure that each class to be tested has a corresponding test class, and that you've created a custom int main that executes each test class.

For example:

class TestClassA : public QObject {    Q_OBJECT public:    TestClassA();     ...  private Q_SLOTS:    void testCase1();    ... };  class TestClassB : public QObject {    Q_OBJECT public:    TestClassB();     ...  private Q_SLOTS:    void testCase2();    ... };  void TestClassA::testCase1() {    // Define test here. }  void TestClassB::testCase2() {    // Define test here. }  // Additional tests defined here.  // Note: This is equivalent to QTEST_APPLESS_MAIN for multiple test classes. int main(int argc, char** argv) {    int status = 0;    {       TestClassA tc;       status |= QTest::qExec(&tc, argc, argv);    }    {       TestClassB tc;       status |= QTest::qExec(&tc, argc, argv);    }    return status; } 

Obviously, the different test classes can be spread out over multiple translation units, then simply included in the translation unit with your int main. Don't forget to include the appropriate .moc files.

like image 116
RA. Avatar answered Sep 22 '22 00:09

RA.