2012-11-03 33 views
5

Tôi có một thử nghiệm đơn vị mà tôi cần chạy cho 200 kết hợp dữ liệu có thể có. (Việc thực hiện sản xuất có dữ liệu được kiểm tra trong các tập tin cấu hình. Tôi biết làm thế nào để thử các giá trị này). Tôi thích nit viết trường hợp thử nghiệm riêng biệt cho mỗi kết hợp và sử dụng một số cách lặp qua dữ liệu. Có cách nào trực tiếp như vậy bằng cách sử dụng thử nghiệm của Google cho C++ không?Cách sử dụng thử nghiệm google cho C++ để chạy qua kết hợp dữ liệu

Cảm ơn, Karthick

+0

Tại sao bạn không sử dụng một mảng các cấu trúc để giữ dữ liệu thử nghiệm của bạn và lặp lại cho dù mỗi mục nhập? Bạn có thể chỉ có một trường hợp kiểm tra để kiểm tra tất cả các kết hợp. –

+0

Xin chào Emile, cảm ơn lời đề nghị. Khi tôi thử nó, nếu một kết hợp thất bại, nó sẽ dừng trường hợp thử nghiệm tiến hành thêm và không báo cáo tỷ lệ thành công một cách chính xác. Vào cuối ngày, đây là những trường hợp thử nghiệm khác nhau đối với tôi. –

Trả lời

11

Bạn có thể sử dụng số Value-parameterized tests của gtest cho việc này.

Sử dụng điều này cùng với máy phát điện Combine(g1, g2, ..., gN) có vẻ giống như đặt cược tốt nhất của bạn.

Ví dụ sau populates 2 vector s, một trong những int s và khác string s, sau đó chỉ với bộ ghép đo duy nhất, tạo ra các bài kiểm tra cho mỗi sự kết hợp của các giá trị có sẵn trong 2 vector s:

#include <iostream> 
#include <string> 
#include <tuple> 
#include <vector> 
#include "gtest/gtest.h" 

std::vector<int> ints; 
std::vector<std::string> strings; 

class CombinationsTest : 
    public ::testing::TestWithParam<std::tuple<int, std::string>> {}; 

TEST_P(CombinationsTest, Basic) { 
    std::cout << "int: "  << std::get<0>(GetParam()) 
      << " string: \"" << std::get<1>(GetParam()) 
      << "\"\n"; 
} 

INSTANTIATE_TEST_CASE_P(AllCombinations, 
         CombinationsTest, 
         ::testing::Combine(::testing::ValuesIn(ints), 
              ::testing::ValuesIn(strings))); 

int main(int argc, char **argv) { 
    for (int i = 0; i < 10; ++i) { 
    ints.push_back(i * 100); 
    strings.push_back(std::string("String ") + static_cast<char>(i + 65)); 
    } 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 
+0

Hãy để tôi thử điều này và liên hệ lại với bạn. –

+0

Hoạt động hoàn hảo. Cảm ơn rất nhiều. –

+0

Ví dụ tối thiểu thực sự đáng yêu, cảm ơn. – TimZaman

2

Sử dụng một mảng của cấu trúc (gọi tắt là, nói, Combination) để chứa dữ liệu thử nghiệm của bạn, và vòng lặp dù mỗi mục trong một thử nghiệm duy nhất. Kiểm tra từng kết hợp bằng cách sử dụng EXPECT_EQ thay vì ASSERT_EQ để kiểm tra không bị hủy và bạn có thể tiếp tục kiểm tra các kết hợp khác.

quá tải operator<< cho một Combination để bạn có thể xuất nó vào một ostream:

ostream& operator<<(ostream& os, const Combination& combo) 
{ 
    os << "(" << combo.field1 << ", " << combo.field2 << ")"; 
    return os; 
} 

quá tải operator== cho một Combination để bạn có thể dễ dàng so sánh hai kết hợp cho sự bình đẳng:

bool operator==(const Combination& c1, const Combination& c2) 
{ 
    return (c1.field1 == c2.field1) && (c1.field2 == c2.field2); 
} 

Và bài kiểm tra đơn vị có thể trông giống như sau:

TEST(myTestCase, myTestName) 
{ 
    int failureCount = 0; 
    for (each index i in expectedComboTable) 
    { 
     Combination expected = expectedComboTable[i]; 
     Combination actual = generateCombination(i); 
     EXPECT_EQ(expected, actual); 
     failureCount += (expected == actual) ? 0 : 1; 
    } 
    ASSERT_EQ(0, failureCount) << "some combinations failed"; 
} 
+0

Hãy để tôi thử nó và lấy lại cho bạn. –

+0

Hi Emile, mặc dù điều này nghe có vẻ dễ dàng, tôi nhận được số lượng các trường hợp thử nghiệm được thực hiện như 1 ngay cả đối với 100 kết hợp trong expectedComboTable. Do đó, tôi sẽ cần làm lại bảng điều khiển báo cáo và cộng sự để cung cấp số lượng kết hợp chính xác không thành công cho các trường hợp có kết hợp. Quá nhiều đau đầu. Vì vậy, tôi sẽ không thể sử dụng nó. Cảm ơn ý tưởng. –

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