2011-06-06 25 views
13

Tôi muốn viết thử nghiệm C++ Google có thể sử dụng value-parameterized tests với nhiều tham số của các kiểu dữ liệu khác nhau, lý tưởng phù hợp với độ phức tạp của các kiểm tra mbUnit sau được viết bằng C++/CLI.Có thể tham số giá trị của Googletest với nhiều loại thông số khác nhau phù hợp với tính linh hoạt của mbUnit không?

Lưu ý mức độ nhỏ gọn này, với thuộc tính [Test] cho biết đây là phương pháp thử và thuộc tính [Row(...)] xác định giá trị cho một phiên âm.

[Test] 
[Row("Empty.mdb", "select count(*) from collar", 0)] 
[Row("SomeCollars.mdb", "select count(*) from collar", 17)] 
[Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4)] 
void CountViaDirectSQLCommand(String^ dbname, String^ command, int numRecs) 
{ 
    String^ dbFilePath = testDBFullPath(dbname); 
    { 
     StAnsi fpath(dbFilePath); 
     StGdbConnection db(fpath); 
     db->Connect(fpath); 
     int result = db->ExecuteSQLReturningScalar(StAnsi(command)); 
     Assert::AreEqual(numRecs, result); 
    } 
} 

Hoặc thậm chí tốt hơn, kiểm tra kỳ lạ hơn này từ C# (đẩy ranh giới của những gì có thể được xác định trong Net thuộc tính xa hơn những gì có thể trong C++/CLI):

[Test] 
[Row("SomeCollars.mdb", "update collar set x=0.003 where hole_id='WD004'", "WD004", 
    new string[] { "x", "y" }, 
    new double[] { 0.003, 7362.082 })] // y value unchanged 
[Row("SomeCollars.mdb", "update collar set x=1724.8, y=6000 where hole_id='WD004'", "WD004", 
    new string[] { "x", "y" }, 
    new double[] { 1724.8, 6000.0 })] 
public void UpdateSingleRowByKey(string dbname, string command, string idValue, string[] fields, double[] values) 
{ 
... 
} 

Các help nói Kiểm tra giá trị tham số hóa sẽ cho phép bạn viết thử nghiệm của bạn chỉ một lần và sau đó dễ dàng khởi tạo và chạy nó với một số lượng tùy ý các giá trị tham số. nhưng tôi khá chắc chắn đó là đề cập đến số lượng các trường hợp thử nghiệm.

Thậm chí không thay đổi các loại dữ liệu, có vẻ như với tôi rằng thử nghiệm được tham số hóa chỉ có thể mất thông số?

Trả lời

21

Có, có một thông số duy nhất. Tuy nhiên, bạn có thể làm cho thông số đó trở nên phức tạp một cách tùy ý. Bạn có thể thích ứng với mã từ tài liệu hướng dẫn sử dụng bạn loại, ví dụ:

class AndyTest : public ::testing::TestWithParam<Row> { 
    // You can implement all the usual fixture class members here. 
    // To access the test parameter, call GetParam() from class 
    // TestWithParam<T>. 
}; 

Sau đó, xác định kiểm tra tham số của bạn:

TEST_P(AndyTest, CountViaDirectSQLCommand) 
{ 
    // Call GetParam() here to get the Row values 
    Row const& p = GetParam(); 
    std::string dbFilePath = testDBFullPath(p.dbname); 
    { 
    StAnsi fpath(dbFilePath); 
    StGdbConnection db(p.fpath); 
    db.Connect(p.fpath); 
    int result = db.ExecuteSQLReturningScalar(StAnsi(p.command)); 
    EXPECT_EQ(p.numRecs, result); 
    } 
} 

Cuối cùng, nhanh chóng nó:

INSTANTIATE_TEST_CASE_P(InstantiationName, AndyTest, ::testing::Values(
    Row("Empty.mdb", "select count(*) from collar", 0), 
    Row("SomeCollars.mdb", "select count(*) from collar", 17), 
    Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4) 
)); 
+1

Cảm ơn, Rob. Sử dụng một cấu trúc của một số loại cho các tham số duy nhất là những gì tôi sợ sẽ là giải pháp. Như bạn có thể thấy từ bản chỉnh sửa của tôi để hiển thị bài kiểm tra đầy đủ, nó làm cho phương pháp tiếp cận gtest nặng hơn rất nhiều so với kiểu mbUnit/NUnit. Tôi chỉ nhận ra rằng cũng có sự cam kết TẤT CẢ các bài kiểm tra cho một trận đấu nhất định phải được tham số hóa so với nó là một sự lựa chọn cho mỗi bài kiểm tra cho những người .Net. Tuy nhiên, đối với những người không muốn sử dụng C++/CLI để kiểm tra mã gốc của họ, tham số gtest vẫn tốt hơn so với không có gì được cung cấp bởi các bộ gốc khác! –

+0

Có, nhưng nó tầm thường để tạo ra một thử nghiệm thử nghiệm nếu bạn muốn có một loại tham số. Bạn có thể sử dụng thừa kế nếu tất cả chúng đều cần thiết lập và giải mã tương tự. Nếu bạn không có thiết lập và teardown, sau đó fixture có thể được * chính xác * mã tôi đã hiển thị ở đây cho 'AndyTest'. Phần thân của các bài kiểm tra không cần phải lớn hơn nhiều, vì bản chỉnh sửa của tôi hiển thị bằng cách đưa biến tham số 'p'. Có thể bạn sẽ không bao giờ nhận được * khá * thanh lịch như .Net framework framework vì C++ không hỗ trợ chú thích, vì vậy bạn sẽ luôn có một vài khai báo riêng biệt. –

+0

@RobKennedy Thuộc tính 'Row' này có tài liệu không ..? Bạn có thể chỉ cho tôi một liên kết hoặc một cái gì đó? –

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