2011-08-26 51 views
71

Sử dụng Google Test 1.6 (Windows 7, Visual Studio C++). Làm thế nào tôi có thể tắt một thử nghiệm nhất định? (aka làm thế nào tôi có thể ngăn chặn một thử nghiệm chạy). Tôi có thể làm gì ngoài việc bình luận toàn bộ bài kiểm tra?GoogleTest: Cách bỏ qua bài kiểm tra?

Trả lời

98

Các docs cho Google thử nghiệm 1,7 suggest:

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

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) { ... } 
+0

chỉ tìm thấy nó quá và bộ lọc – User

+0

@Bill, tôi tìm thấy nó ngay trước khi bạn đăng bình luận của bạn ... (và tôi đặt nó lên như một câu trả lời quá). Sau đó tôi đã xóa nhận xét 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

46

Bạn cũng run a subset of tests thể, theo các tài liệu:

Chạy một tập hợp con của các Kỳ Thi

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

Định dạng của bộ lọc là ':' - danh sách mẫu ký tự được phân tách là '2 '(được gọi là mẫu dương) được theo sau bởi '-' và một ':' khác - danh sách mẫu được phân tách (được gọi là mẫu âm) . Thử nghiệm khớp với bộ lọc nếu và chỉ khi nó phù hợp với bất kỳ mẫu số dương nào nhưng không khớp với bất kỳ mẫu phủ định nào.

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 thành '-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 đẹp nhất, nhưng nó hoạt động.

5

Nếu có nhiều hơn một bài kiểm tra là cần thiết bị bỏ qua

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

Đối với cách tiếp cận khác, bạn có thể bọc xét nghiệm của bạn trong một chức năng và sử dụng kiểm tra điều kiện bình thường tại thời gian chạy để chỉ thực hiện 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 khi tôi đang cố gắng chạy một số kiểm tra chỉ khi một hệ thống hỗ trợ dual stack IPv6.

Về mặt kỹ thuật, công cụ dualstack không thực sự là thử nghiệm đơ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 thử nghiệm chúng hoạt động và điều này đảm bảo rằng nó sẽ không báo cáo lỗi khi nó không phải là 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 dualstack (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 các bài kiểm tra sẽ thay đổi có thể gây ra các vấn đề với một cái gì đó giám sát số lượng các bài kiểm tra thành công.

Bạn cũng có thể sử dụng ASSERT_ * thay vì EQUAL_ *. Assert sẽ 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 công cụ dư thừa được đổ vào bàn điều khiển.

12

Dưới đây là biểu thức bao gồm các bài kiểm tra có tên có chuỗi foo1 hoặc foo2 trong họ và loại trừ các xét nghiệm có tên có chuỗi bar1 hoặc bar2 trong đó:

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

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ả thử nghiệm, 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. để kiểm tra mọi thứ khác.
Bạn cũng có thể kiểm tra/loại trừ bộ tính năng bằng cách sử dụng ký tự đại diện và viết danh sách, "MyLibrary.TestNetwork *" hoặc "-MyLibrary.TestFileSystem *".

+0

Đây là một giải pháp tuyệt vời. Tôi sử dụng nó để loại trừ một số xét 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

+0

Thực tế là không hoạt động vì mặc định là "' * '" không "". 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

0

Tôi có cùng nhu cầu kiểm tra có điều kiện và tôi đã tìm ra cách giải quyết tốt. Tôi đã định nghĩa một macro TEST_C hoạt động giống như một macro TEST_F, nhưng nó có tham số thứ ba, là một biểu thức boolean, thời gian chạy được đánh giá trong main.cpp TRƯỚC KHI các thử nghiệm được bắt đầu. Các thử nghiệm đánh giá sai sẽ không được thực hiện. Vĩ mô là xấu xí, 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, bạn cần lặp này để loại trừ các bài kiểm tra đá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(); 
Các vấn đề liên quan