GoogleTest: Làm thế nào để bỏ qua một bài kiểm tra?


119

Sử dụng Google Test 1.6 (Windows 7, Visual Studio C ++). Làm cách nào để tắt một bài kiểm tra nhất định? (hay còn gọi là cách tôi có thể ngăn kiểm tra chạy). Tôi có thể làm gì ngoài việc nhận xét toàn bộ bài kiểm tra không?

Câu trả lời:


177

Các tài liệu cho Google thử nghiệm 1,7 gợi ý :

"Nếu bạn có một bài kiểm tra bị hỏng mà bạn không thể sửa ngay lập tức, bạn có thể thêm tiền tố DISABLED_ vào tên của nó. Điều này sẽ loại trừ nó khỏi quá trình thực thi."

Ví dụ:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public ::testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

1
vừa tìm thấy nó và bộ lọc
Người dùng

@Bill, tôi đã tìm thấy nó ngay trước khi bạn đăng bình luận của mình ... (và tôi cũng đưa nó lên làm câu trả lời). Sau đó, tôi đã xóa bình luận của mình, cho rằng nó đã lỗi thời ... nhưng đó là một số thông tin thực sự tốt! +1
Kiril

67

Bạn cũng có thể chạy một tập hợp con các bài kiểm tra , theo tài liệu:

Chạy một tập hợp con các bài kiểm tra

Theo mặc định, chương trình Kiểm tra của Google chạy tất cả các bài kiểm tra mà người dùng đã xác định. Đôi khi, bạn chỉ muốn chạy một tập hợp con của các bài kiểm tra (ví dụ: để gỡ lỗi hoặc nhanh chóng xác minh một thay đổi). Nếu bạn đặt biến môi trường GTEST_FILTER hoặc cờ --gtest_filter thành một chuỗi bộ lọc, Google Test sẽ chỉ chạy các bài kiểm tra có tên đầy đủ (ở dạng TestCaseName.TestName) khớp với bộ lọc.

Định dạng của bộ lọc là danh sách các mẫu ký tự đại diện được phân tách bằng ':' (được gọi là các mẫu khẳng định), theo sau là dấu '-' và một danh sách khác ':' - mẫu được phân tách (được gọi là các mẫu phủ định). Kiểm tra khớp với bộ lọc nếu và chỉ khi nó khớp với bất kỳ mẫu tích cực nào nhưng không khớp với bất kỳ mẫu phủ định nào.

Một mẫu có thể chứa '*' (khớp với bất kỳ chuỗi nào) hoặc '?' (khớp với bất kỳ ký tự đơn nào). Để thuận tiện, bộ lọc '* -NegativePatterns' cũng có thể được viết là '-NegativePatterns'.

Ví dụ:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

Không phải là giải pháp tốt nhất, nhưng nó hoạt động.


24

Bây giờ bạn có thể sử dụng GTEST_SKIP()macro để bỏ qua kiểm tra có điều kiện trong thời gian chạy. Ví dụ:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

Lưu ý rằng đây là một tính năng mới xuất hiện nên bạn có thể cần cập nhật thư viện GoogleTest của mình để sử dụng nó.


Tính năng này chưa được phát hành. Không chắc rằng nó sẽ được đưa vào nhánh 1.8.x, vì ở đó chỉ chấp nhận các bản sửa lỗi. 1.9 vẫn chưa có sẵn, thậm chí chưa được công bố vào thời điểm này.
ocroquette

2
GTEST_SKIP()có sẵn từ 1.10.0.
mattdibi

Đáng buồn là tài liệu về vấn đề này vẫn còn khan hiếm. Có vẻ như cũng có GTEST_SKIP_("some message")(lưu ý gạch dưới ở cuối)
Matthäus Brandl

19

Đây là biểu thức để bao gồm các thử nghiệm có tên có chuỗi foo1 hoặc foo2 trong đó và loại trừ các thử nghiệm có tên có chuỗi bar1 hoặc bar2 trong đó:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

10

Tôi thích làm điều đó trong mã:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

Tôi có thể nhận xét cả hai dòng để chạy tất cả các bài kiểm tra, bỏ ghi chú dòng đầu tiên để kiểm tra một tính năng duy nhất mà tôi đang điều tra / làm việc hoặc bỏ ghi chú dòng thứ hai nếu một bài kiểm tra bị hỏng nhưng tôi muốn kiểm tra mọi thứ khác.
Bạn cũng có thể kiểm tra / loại trừ một bộ tính năng bằng cách sử dụng các ký tự đại diện và viết một danh sách, "MyLibrary.TestNetwork *" hoặc "-MyLibrary.TestFileSystem *".


Đây là một giải pháp tuyệt vời. Tôi sử dụng nó để loại trừ một số thử nghiệm theo mặc định nếu bộ lọc trống. Chúng có thể được kích hoạt với export GTEST_FILTER='*'.
Timmmm

Trên thực tế điều đó không hoạt động vì mặc định là " *" không phải "". Thay vào đó, tôi sẽ chỉ sử dụng một biến môi trường khác ghi đè bộ lọc.
Timmmm

Bạn đã xác định "bộ lọc" ở đâu? Nó là một chuỗi?
beasone 19/02/19

Tôi không định nghĩa nó vì vậy tôi nghĩ nó phải là một toàn cầu được bao gồm từ gtest / gtest.h?
pilkch

6

Nếu cần nhiều hơn một bài kiểm tra, hãy bỏ qua

--gtest_filter=-TestName.*:TestName.*TestCase

4

Đối với một cách tiếp cận khác, bạn có thể bao bọc các bài kiểm tra của mình trong một hàm và sử dụng các kiểm tra có điều kiện bình thường trong thời gian chạy để chỉ thực thi chúng nếu bạn muốn.

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

Điều này hữu ích cho tôi vì tôi đang cố gắng chạy một số thử nghiệm chỉ khi hệ thống hỗ trợ IPv6 ngăn xếp kép.

Về mặt kỹ thuật, công cụ dualstack không thực sự là một bài kiểm tra đơn vị vì nó phụ thuộc vào hệ thống. Nhưng tôi thực sự không thể thực hiện bất kỳ thử nghiệm tích hợp nào cho đến khi tôi đã kiểm tra chúng vẫn hoạt động và điều này đảm bảo rằng nó sẽ không báo lỗi khi không phải do lỗi mã.

Đối với thử nghiệm của nó, tôi có các đối tượng sơ khai mô phỏng sự hỗ trợ của hệ thống cho ngăn xếp kép (hoặc thiếu) bằng cách xây dựng các ổ cắm giả.

Nhược điểm duy nhất là đầu ra thử nghiệm và số lượng thử nghiệm sẽ thay đổi, điều này có thể gây ra sự cố với một số thứ giám sát số lượng thử nghiệm thành công.

Bạn cũng có thể sử dụng ASSERT_ * thay vì EQUAL_ *. Khẳng định ý chí về phần còn lại của bài kiểm tra nếu nó không thành công. Ngăn chặn rất nhiều nội dung thừa được đưa vào bảng điều khiển.


4

Tôi cũng có nhu cầu tương tự đối với các bài kiểm tra có điều kiện và tôi đã tìm ra một giải pháp tốt. Tôi đã xác định macro TEST_C hoạt động giống như macro TEST_F, nhưng nó có tham số thứ ba, là biểu thức boolean, thời gian chạy được đánh giá trong main.cpp TRƯỚC KHI bắt đầu kiểm tra. Các thử nghiệm đánh giá sai không được thực hiện. Macro xấu, nhưng nó trông giống như:

#pragma once
extern std::map<std::string, std::function<bool()> >* m_conditionalTests;
#define TEST_C(test_fixture, test_name, test_condition)\
class test_fixture##_##test_name##_ConditionClass\
{\
    public:\
    test_fixture##_##test_name##_ConditionClass()\
    {\
        std::string name = std::string(#test_fixture) + "." + std::string(#test_name);\
        if (m_conditionalTests==NULL) {\
            m_conditionalTests = new std::map<std::string, std::function<bool()> >();\
        }\
        m_conditionalTests->insert(std::make_pair(name, []()\
        {\
            DeviceInfo device = Connection::Instance()->GetDeviceInfo();\
            return test_condition;\
        }));\
    }\
} test_fixture##_##test_name##_ConditionInstance;\
TEST_F(test_fixture, test_name)

Ngoài ra, trong main.cpp của bạn, bạn cần vòng lặp này để loại trừ các thử nghiệm đánh giá sai:

// identify tests that cannot run on this device
std::string excludeTests;
for (const auto& exclusion : *m_conditionalTests)
{
    bool run = exclusion.second();
    if (!run)
    {
        excludeTests += ":" + exclusion.first;
    }
}

// add the exclusion list to gtest
std::string str = ::testing::GTEST_FLAG(filter);
::testing::GTEST_FLAG(filter) = str + ":-" + excludeTests;

// run all tests
int result = RUN_ALL_TESTS();

Bạn đã xác định "bộ lọc" như thế nào trong std :: string str = :: testing :: GTEST_FLAG (filter) ;?
beasone 19/02/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.