2010-04-30 46 views
14

Có khung kiểm thử đơn vị nào cho C như JUnit và Nunit cho java và .NET không? Hoặc làm cách nào để kiểm tra một đoạn mã được viết bằng C cho các kịch bản khác nhau?khung kiểm tra đơn vị cho C

Cảm ơn trước ......

+4

http://www.google.com/search?q=unit+testing+c – bdhar

+2

1 để bình luận bdhar của. Nếu bạn gặp khó khăn khi tìm kiếm SO/Google, thì kiểm tra đơn vị là ít nhất của bạn lo lắng :-) – richsage

+0

Ít nhất hai bản sao phải trong các liên kết có liên quan ... – dmckee

Trả lời

5

Tôi đã làm việc một số với Check và nó rất dễ dàng để cài đặt. Nó được sử dụng bởi một số dự án hoạt động lớn như GStreamer. Dưới đây là một ví dụ đơn giản về lỗi nếu dòng:

fail_if (0 == get_element_position(spot), "Position should not be 0"); 
0

Vâng, chỉ cần thay thế J từ Java bởi một C từ ... C

Cunit

mặc dù điều có lẽ CUT là chung chung hơn.

Cuối cùng tôi có thể byased bởi vì tôi thực sự thích NetBSD, nhưng bạn cũng nên cung cấp cho ATF một thử

1

Tôi vẫn còn mới để các khuôn khổ kiểm tra đơn vị , nhưng gần đây tôi đã thử cut, checkcunit. Điều này dường như chống lại một số kinh nghiệm của người khác (xem Unit Testing C Code cho một câu hỏi trước), nhưng tôi thấy cunit dễ nhất để có được đi. Điều này cũng có vẻ là một lựa chọn tốt cho tôi, như cunit có nghĩa vụ phải phù hợp tốt với các khuôn khổ xunit khác và tôi chuyển đổi ngôn ngữ hơi thường xuyên.

1

Tôi đã rất hài lòng với CuTest lần cuối cùng tôi cần để kiểm tra đơn vị C. Chỉ có một cặp .c/.h, đi kèm với một tập lệnh shell nhỏ tự động tìm tất cả các bài kiểm tra để xây dựng bộ thử nghiệm và xác nhận lỗi hoàn toàn không hữu ích.

Dưới đây là một ví dụ về một trong các bài kiểm tra của tôi:

void TestBadPaths(CuTest *tc) { 
    // Directory doesn't exist 
    char *path = (char *)"/foo/bar"; 
    CuAssertPtrEquals(tc, NULL, searchpath(path, "sh")); 

    // A binary which isn't found 
    path = (char *)"/bin"; 
    CuAssertPtrEquals(tc, NULL, searchpath(path, "foobar")); 
} 
2

Chỗ ngồi nhất là bản thân tôi đã viết cho bản thân và nguồn mở. Mục đích là đơn giản và có cú pháp rõ ràng.

http://code.google.com/p/seatest/

một loại xét nghiệm đơn giản cơ bản sẽ là ...

#include "seatest.h" 
// 
// create a test... 
// 
void test_hello_world() 
{ 
    char *s = "hello world!"; 
    assert_string_equal("hello world!", s); 
    assert_string_contains("hello", s); 
    assert_string_doesnt_contain("goodbye", s); 
    assert_string_ends_with("!", s); 
    assert_string_starts_with("hell", s); 
} 

// 
// put the test into a fixture... 
// 
void test_fixture_hello(void) 
{ 
    test_fixture_start();  
    run_test(test_hello_world); 
    test_fixture_end();  
} 

// 
// put the fixture into a suite... 
// 
void all_tests(void) 
{ 
    test_fixture_hello(); 
} 

// 
// run the suite! 
// 
int main(int argc, char** argv) 
{ 
    run_tests(all_tests); 
    return 0; 
} 
2

Ngoài ra còn có cspec, mà là một rất đơn giản và dễ sử dụng khuôn khổ BDD.

Nếu bạn đã từng sử dụng một cái gì đó giống như rspec hoặc mocha nó sẽ là tầm thường để sử dụng. Nó thậm chí không yêu cầu bạn viết một hàm main.

Dưới đây là một ví dụ:

context (example) { 

    describe("Hello world") { 

     it("true should be true") { 
      should_bool(true) be equal to(true); 
     } end 

     it("true shouldn't be false") { 
      should_bool(true) not be equal to(false); 
     } end 

     it("this test will fail because 10 is not equal to 11") { 
      should_int(10) be equal to(11); 
     } end 

     skip("this test will fail because \"Hello\" is not \"Bye\"") { 
      should_string("Hello") be equal to("Bye"); 
     } end 

    } end 

}