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?
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:
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) { ... }
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.
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ó.
GTEST_SKIP()
có sẵn từ 1.10.0.
GTEST_SKIP_("some message")
(lưu ý gạch dưới ở cuối)
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 *".
export GTEST_FILTER='*'
.
*
" 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.
Đố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.
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();