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. Correct project structure for QTest with qbs.
QtWS25 Last Chance

Correct project structure for QTest with qbs.

Scheduled Pinned Locked Moved Solved General and Desktop
qttestqbsundefined refertest
2 Posts 1 Posters 649 Views
  • 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.
  • J Offline
    J Offline
    john9947
    wrote on last edited by john9947
    #1

    Hi Guys,
    I'm trying to write a Unit Test for a production code class MyCustomClass . I'm using qbs as build System, Qt 5.8.0 and QtCreator. My production code and my QTest are separate Applications which are bundled together into one Project. The test case runs well if I put a simple QFAIL in it, but as soon as I try to use (create an object) of MyCustomClass the Linker complains about an undefined reference to MyCustomClass members.

    C:\Users\SS76986\Documents\AutotestEval\tests\testcase1\tst_testcase1.cpp:32: error: undefined reference to `MyCustomClass::MyCustomClass()'
    C:\Users\SS76986\Documents\AutotestEval\tests\testcase1\tst_testcase1.cpp:33: error: undefined reference to `MyCustomClass::add(int, int)'
    

    Can anyone tell me how to get rid of the complains? I'm not even sure if the Project structure I chose is correct.
    Since I'm not able to upload the whole Project as zip File I'll Show you the files which are relevant.
    Project Structure:
    0_1550243605513_projectStructure.JPG
    ProjectFile (AutotestEval.qbs):

    import qbs
    
    Project {
        name: "AutotestEval"
        references: [
    	"src/",
            "tests/"
        ]
    }
    

    Production Code Product (src.qbs):

    import qbs
    
    QtApplication {
        name: "TheApp"
    
        Export {
                Depends { name: "cpp" }
                cpp.includePaths: product.sourceDirectory
                cpp.defines: ["MYSHAREDLIB_LIBRARY"]
        }
    
    
        Group{
            name: "Grp_Main"
            files: [
                 "main.cpp",
                 "mycustomclass.cpp",
                 "mycustomclass.h",
            ]
        }
    }
    

    Unit Test Product (test.qbs):

    import qbs
    
    CppApplication {
        name: "Testcase1"
    
        Depends { name: "Qt.testlib" }
        Depends { name: "TheApp" }
    
    
        Group{
            name: "Testcase1"
            files: ["tst_testcase1.cpp"]
        }
    }
    

    Test Sourcecode (tst_testcase1.cpp)

    #include <QtTest>
    #include <mycustomclass.h>
    
    // add necessary includes here
    
    class testCase1 : public QObject
    {
        Q_OBJECT
    
    public:
    
    private slots:
        void test_case1();
    
    };
    
    void testCase1::test_case1()
    {
        // This does not work!
            MyCustomClass sut;
            QVERIFY(sut.add(1,1) == 2);
    
        // This works well
        //QFAIL("Hello Fail!");
    }
    
    QTEST_APPLESS_MAIN(testCase1)
    
    #include "tst_testcase1.moc"
    
    
    1 Reply Last reply
    0
    • J Offline
      J Offline
      john9947
      wrote on last edited by
      #2

      I found a solution for the issue: Simply split the main() from the rest of the Project . Here is the updated Production Code Product specification:

      import qbs
      
      Project {
          name: "TheRealApp"
      
          QtApplication {
              name: "TheApp"
      
              Depends { name: "cpp" }
              Depends { name: "library" }
      
              Group {
                  name: "Main"
                  files: [
                      "main.cpp",
                  ]
              }
      
          }
      
          StaticLibrary{
              name: "library"
      
              Depends { name: "cpp"     }
              Depends { name: "Qt.core" }
              Export {
                  Depends { name: "cpp" }
                  cpp.includePaths: product.sourceDirectory
              }
      
              Group{
                  name: "Grp_Main"
                  files: [
                      "mycustomclass.cpp",
                      "mycustomclass.h",
                  ]
              }
          }
      }
      
      1 Reply Last reply
      1

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved