How to run multiple QTest classes?

后端 未结 1 1176
没有蜡笔的小新
没有蜡笔的小新 2021-02-19 09:07

I have a subproject where I put all my QTest unit tests and build a stand-alone test application that runs the tests (i.e. I run it from within Qt Creator). I have

相关标签:
1条回答
  • 2021-02-19 09:39

    I once found a nice solution using a plain Qt project (no TEMPLATE = subdirs) which uses a macro approach for creating the main function and automatic registering of all test classes (macro, too) with only a simple helper header file.

    Here is a sample test class (only the relevant header file):

    #ifndef FOOTESTS_H
    #define FOOTESTS_H
    
    #include "AutoTest.h"
    
    class FooTests : public QObject
    {
        Q_OBJECT
        private slots:
            void initTestCase();
            void test1();
            void test2();
            void cleanupTestCase();
    };
    
    DECLARE_TEST(FooTests)
    
    #endif // FOOTESTS_H
    

    and the main, which consumes every test class created this way:

    #include "AutoTest.h"
    
    TEST_MAIN
    

    The code of AutoTest.h:

    #ifndef AUTOTEST_H
    #define AUTOTEST_H
    
    #include <QTest>
    #include <QList>
    #include <QString>
    #include <QSharedPointer>
    
    namespace AutoTest
    {
     typedef QList<QObject*> TestList;
    
     inline TestList& testList()
     {
      static TestList list;
      return list;
     }
    
     inline bool findObject(QObject* object)
     {
      TestList& list = testList();
      if (list.contains(object))
      {
       return true;
      }
      foreach (QObject* test, list)
      {
       if (test->objectName() == object->objectName())
       {
        return true;
       }
      }
      return false;
     }
    
     inline void addTest(QObject* object)
     {
      TestList& list = testList();
      if (!findObject(object))
      {
       list.append(object);
      }
     }
    
     inline int run(int argc, char *argv[])
     {
      int ret = 0;
    
      foreach (QObject* test, testList())
      {
       ret += QTest::qExec(test, argc, argv);
      }
    
      return ret;
     }
    }
    
    template <class T>
    class Test
    {
    public:
     QSharedPointer<T> child;
    
     Test(const QString& name) : child(new T)
     {
      child->setObjectName(name);
      AutoTest::addTest(child.data());
     }
    };
    
    #define DECLARE_TEST(className) static Test<className> t(#className);
    
    #define TEST_MAIN \
     int main(int argc, char *argv[]) \
     { \
      return AutoTest::run(argc, argv); \
     }
    
    #endif // AUTOTEST_H
    

    All credits goes to Rob Caldecott.

    0 讨论(0)
提交回复
热议问题