2015-06-23 15 views
12

Qt đi kèm với QTest và có một số tài liệu: ví dụ: an official tutorial.Qt: chạy thử nghiệm đơn vị từ nhiều lớp kiểm tra và tóm tắt kết quả từ tất cả chúng

Tuy nhiên, QTest khuyến khích bạn tổ chức các bài kiểm tra đơn vị dưới dạng tệp thực thi riêng biệt. Có macro đặc biệt cho điều này, tạo ra main(): QTEST_MAIN()

Thành thật mà nói, tôi thực sự không thích cách tiếp cận này: thường hữu ích hơn khi chạy tất cả các thử nghiệm cùng một lúc, để đảm bảo rằng những thay đổi gần đây t phá vỡ bất cứ điều gì. Đôi khi, rất hữu ích để che giấu một số thử nghiệm hoặc thực hiện một số thử nghiệm riêng lẻ, nhưng đây là một ngoại lệ, không phải là quy tắc.

Vì vậy, tôi muốn chạy tất cả các thử nghiệm cùng một lúc. Ok, tôi có thể viết của riêng tôi main() mà thực hiện tất cả các bài kiểm tra tôi muốn, nói, như thế này:

int main(int argc, char **argv) 
{ 
    int status = 0; 

    //-- run all tests 
    { 
     TestHTCodecISO14230 tc; 
     status |= QTest::qExec(&tc, argc, argv); 
    } 

    { 
     TestHTDataMsg tc; 
     status |= QTest::qExec(&tc, argc, argv); 
    } 

    return status; 
} 

Và nó chạy tất cả các bài kiểm tra, nhưng vấn đề là tôi không có bản tóm tắt thuận tiện của tất cả các bài kiểm tra. Này, cho hai bài kiểm tra trên, tôi có hai bản tóm tắt riêng biệt:

********* Start testing of TestHTCodecISO14230 ********* 
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1) 
PASS : TestHTCodecISO14230::initTestCase() 
PASS : TestHTCodecISO14230::decode_summary() 
PASS : TestHTCodecISO14230::encode() 
PASS : TestHTCodecISO14230::decode_encoded() 
PASS : TestHTCodecISO14230::cleanupTestCase() 
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted 
********* Finished testing of TestHTCodecISO14230 ********* 
********* Start testing of TestHTDataMsg ********* 
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1) 
PASS : TestHTDataMsg::initTestCase() 
PASS : TestHTDataMsg::test1() 
PASS : TestHTDataMsg::cleanupTestCase() 
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted 
********* Finished testing of TestHTDataMsg ********* 

Thực tế là trở status sẽ khác không trong trường hợp lỗi chắc chắn là hữu ích, nhưng là sẽ được nhiều hơn nữa hữu ích nếu tôi có tóm tắt cũng như:

Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted 

Từ những gì tôi nhìn thấy, nó là không thể: tôi không thể tìm ra cách để lập trình có được số trôi qua, thất bại, bỏ qua và kiểm tra danh sách đen: qExec() chỉ là một chức năng trong không gian tên QTest, vì vậy, không thể thu thập một số thông tin bổ sung sau khi nó thực thi.

Vâng, chúng ta có thể phân tích các chuỗi đầu ra, nhưng, ugh ...

Đối với tôi, nó trông giống như thiết kế nghèo. Sẽ tốt hơn nếu bạn làm cho lớp QTest trở thành một lớp, sau đó tạo một thể hiện của nó và cấp một số lớp thử nghiệm cho nó. Sau đó, một số thông tin bổ sung có thể được thu thập từ một cá thể.

Hoặc, có thể tôi đã bỏ lỡ điều gì đó.

Vì vậy, câu hỏi đặt ra là: có thể với QTest để có kết quả tóm tắt của tất cả các lớp thử nghiệm đơn vị không?

+0

Không phải 'TestHTCodecISO14230' và' TestHTDataMsg' là lớp học của bạn? Tại sao bạn không thể mở rộng chúng để xử lý các bài kiểm tra không thành công? – vahancho

Trả lời

8

Như tôi đã viết trong nhận xét của tôi, tôi sẽ xây dựng các lớp học thử nghiệm của tôi theo cách sau:

class MyTests: public QObject 
{ 
    Q_OBJECT 
public: 
    MyTests() : m_executed(0), m_failed(0) 
private slots: 
    [..] 
    // This function will be called after each test 
    void cleanup() 
    { 
     m_executed++; 
     if (currentTestFailed()) { 
      m_failed++; 
     }   
    } 

    // Output the summary of the test execution. 
    void report() const 
    { 
     qDebug() << "Totals:" 
       << m_executed - m_failed << "passed," 
       << m_failed << "failed"; 
    } 
private: 
    int m_executed; 
    int m_failed; 
}; 

Nếu bạn có nhiều trường hợp của MyTests lớp, bạn có thể mở rộng API của nó và tổng hợp kết quả thực hiện sản xuất báo cáo thực thi kiểm tra toàn cầu. Chỉ cần sử dụng toàn bộ sức mạnh của các lớp C++.

+0

Cảm ơn câu trả lời, nhưng sau đó tôi sẽ không thể sử dụng macro và bạn bè 'QCOMPARE()'; Tôi sẽ phải tái tạo lại chúng bằng cách nào đó. Tôi sẽ cố gắng. –

+1

@DmitryFrank, nhưng tại sao bạn không thể sử dụng QCOMPARE()? Vui lòng giải thích. – vahancho

Các vấn đề liên quan