단위 테스트 C 코드 [닫기]


853

나는 올 여름 C로 작성된 임베디드 시스템에서 일했다. 내가 일했던 회사가 인수 한 기존 프로젝트였다. JUnit을 사용하여 Java로 단위 테스트를 작성하는 데 익숙해졌지만 시스템에 추가 된 새 코드뿐만 아니라 기존 코드 (리팩토링이 필요함)에 대한 단위 테스트를 작성하는 가장 좋은 방법에 대한 손실이있었습니다.

JUnit으로 Java 코드를 단위 테스트하는 것만 큼 간단한 단위 테스트를 일반 C 코드로 만드는 프로젝트가 있습니까? 임베디드 개발 (arm-linux 플랫폼으로의 크로스 컴파일)에 특별히 적용되는 통찰력은 대단히 감사하겠습니다.



2
@zmo — 소프트웨어 권장 사항소프트웨어 권장 사항 을 얻는 Stack Exchange 사이트입니다. 나는 그것을 사용하지 않았으므로 그것이 얼마나 잘 작동하는지 말할 수 없다. 게시 규칙을 확인한 후 게시해야합니다.
Jonathan Leffler 2013 년

답변:


495

C의 한 단위 테스트 프레임 워크는 Check입니다 . C의 단위 테스트 프레임 워크 목록은 여기 에서 찾을 수 있으며 아래에 재현되어 있습니다. 런타임의 표준 라이브러리 함수 수에 따라 그 중 하나를 사용하거나 사용하지 못할 수 있습니다.

에이스 유닛

AceUnit (Advanced C 및 Embedded Unit)은 편안한 C 코드 단위 테스트 프레임 워크로 청구됩니다. JUnit 4.x를 모방하려고 시도하며 리플렉션 유사 기능을 포함합니다. AceUnit은 임베디드 소프트웨어 개발과 같은 리소스 제약 환경에서 사용될 수 있으며 중요한 것은 단일 표준 헤더 파일을 포함 할 수없고 ANSI / ISO C 라이브러리에서 단일 표준 C 함수를 호출 할 수없는 환경에서 잘 실행됩니다. 또한 Windows 포트가 있습니다. 저자는 이러한 기능을 추가하는 데 관심을 표명했지만 포크를 사용하여 신호를 포착하지는 않습니다. AceUnit 홈페이지를 참조하십시오 .

GNU 자동 유닛

별도의 주소 공간에서 단위 테스트를 실행하는 포크를 포함하여 Check와 동일한 행을 따라갔습니다 (실제로 Check의 원래 작성자는 GNU Autounit에서 아이디어를 빌 렸습니다). GNU Autounit은 GLib를 광범위하게 사용하므로 링크 및 특수 옵션이 필요하지만 특히 GTK 또는 GLib을 이미 사용중인 경우 큰 문제가되지 않을 수 있습니다. GNU Autounit 홈페이지를 참조하십시오 .

c 단위

또한 GLib을 사용하지만 단위 테스트의 주소 공간을 보호하기 위해 분기하지는 않습니다.

C 단위

Win32 GUI 구현 계획이있는 표준 C 현재 단위 테스트의 주소 공간을 포크하거나 보호하지 않습니다. 초기 개발. CUnit 홈페이지를 참조하십시오 .

CuTest

하나의 .c와 하나의 .h 파일이있는 간단한 프레임 워크로 소스 트리에 놓입니다. CuTest 홈페이지를 참조하십시오 .

CppUnit

C ++를위한 최고의 단위 테스트 프레임 워크. C 코드를 테스트하는 데 사용할 수도 있습니다. 안정적이고 적극적으로 개발되었으며 GUI 인터페이스가 있습니다. C에 CppUnit을 사용하지 않는 주된 이유는 첫 번째가 상당히 크며, 두 번째로 C ++로 테스트를 작성해야하므로 C ++ 컴파일러가 필요하다는 것입니다. 이것들이 관심사처럼 들리지 않으면 다른 C ++ 단위 테스트 프레임 워크와 함께 고려할 가치가 있습니다. CppUnit 홈페이지를 참조하십시오 .

embUnit

embUnit (Embedded Unit)은 임베디드 시스템을위한 또 다른 단위 테스트 프레임 워크입니다. AceUnit이 대체 한 것으로 보입니다. 임베디드 유닛 홈페이지 .

MinUnit

최소한의 매크로 만 있으면됩니다! 요점은 코드를 단위 테스트하는 것이 얼마나 쉬운지를 보여주는 것입니다. MinUnit 홈페이지를 참조하십시오 .

안도 씨를위한 CUnit

상당히 새롭고 아직 초기 개발 단계에있는 CUnit 구현입니다. Mr. Ando 홈페이지CUnit을 참조하십시오 .

이 목록은 2008 년 3 월에 마지막으로 업데이트되었습니다.

더 많은 프레임 워크 :

CMocka

CMocka는 모의 객체를 지원하는 C 용 테스트 프레임 워크입니다. 사용 및 설정이 쉽습니다.

CMocka 홈페이지를 참조하십시오 .

표준

Criterion은 자동 테스트 등록, 매개 변수화 된 테스트, 이론을 지원하고 TAP 및 JUnit XML을 포함한 여러 형식으로 출력 할 수있는 크로스 플랫폼 C 단위 테스트 프레임 워크입니다. 각 테스트는 자체 프로세스로 실행되므로 필요한 경우 신호 및 충돌을보고하거나 테스트 할 수 있습니다.

자세한 내용은 Criterion 홈페이지 를 참조하십시오.

허트

HWUT는 C를 크게 지원하는 일반적인 단위 테스트 도구입니다. Makefile을 생성하고, 최소한의 '반복 테이블'로 코딩 된 대규모 테스트 사례를 생성하고, 상태 머신을 따라 걷고, C 스텁을 생성하는 등의 작업을 수행 할 수 있습니다. 일반적인 접근 방식은 매우 독특합니다. 평결은 '좋은 stdout / bad stdout'을 기반으로합니다. 그러나 비교 기능은 유연합니다. 따라서 모든 유형의 스크립트를 사용하여 확인할 수 있습니다. 표준 출력을 생성 할 수있는 모든 언어에 적용 할 수 있습니다.

HWUT 홈페이지를 참조하십시오 .

C 그린

C 및 C ++를위한 최신의 휴대용 언어 간 단위 테스트 및 모의 프레임 워크 선택적 BDD 표기법, 조롱 라이브러리, 단일 프로세스에서 실행할 수있는 기능 (디버깅 용이)을 제공합니다. 테스트 기능을 자동으로 감지하는 테스트 러너를 사용할 수 있습니다. 그러나 프로그래밍 방식으로 자신을 만들 수 있습니다.

이러한 모든 기능 은 CGreen 매뉴얼에 설명되어 있습니다 .

Wikipedia는 단위 테스트 프레임 워크 목록에 C 단위 테스트 프레임 워크의 자세한 목록을 제공합니다 .


처음에는 Check가 매우 견고 해 보입니다. 나는 그것이 실제 사용의 불에서 어떻게 견뎌야하는지 볼 것입니다 ...하지만 분명히 법안에 맞을 것 같습니다.
Paul Osborne

8
임베디드 시스템에서 단위 테스트 코드 검사를 사용합니다. 대부분의 경우 검사는 좋은 선택 이었지만 지금은 uClinux에서 실행되는 시스템에서 작업하고 있으며 검사에는 포크가 필요하므로 해당 시스템에서는 작동하지 않습니다. : /
David Holm

1
@labyrinth 우분투의 한 버전은 2002 년부터 시작되었습니다. 가장 최신 버전은 올해 (2014 년 현재)입니다. 소스에서 컴파일해야했습니다.
Barry Brown

4
HWUT은 원격 제어 가능한 스텁을 생성하는데, 이는 어려운 드라이버와 상호 작용하는 모듈에 대한 테스트를 작성하려는 경우 매우 유용합니다. 대부분의 경우 이러한 드라이버는 PC에 없습니다. HWUT 문서
Frank-Rene Schäfer

1
Check의 Github 페이지 에 따르면 최신 버전은 2016 년 12 월 17 일0.11.0 에 릴리스됩니다 .
Mandeep Sandhu

164

개인적으로 Google 테스트 프레임 워크가 마음에 듭니다 .

C 코드 테스트의 실제 어려움은 외부 모듈에 대한 종속성을 깨뜨 리므로 코드를 단위로 분리 할 수 ​​있습니다. 레거시 코드에 대한 테스트를 시도 할 때 특히 문제가 될 수 있습니다. 이 경우 테스트에서 스텁 함수를 사용하기 위해 링커를 사용하는 경우가 종종 있습니다.

이것이 사람들이 " 솔기 " 에 대해 이야기 할 때 언급하는 것 입니다. C에서 유일한 옵션은 실제로 전 처리기 또는 링커를 사용하여 종속성을 조롱하는 것입니다.

내 C 프로젝트 중 하나의 일반적인 테스트 스위트는 다음과 같습니다.

#include "myimplementationfile.c"
#include <gtest/gtest.h>

// Mock out external dependency on mylogger.o
void Logger_log(...){}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}

실제로 헤더 파일이 아닌 C 파일을 포함하고 있습니다 . 이렇게하면 모든 정적 데이터 멤버에 액세스 할 수 있다는 이점이 있습니다. 여기서 나는 로거를 모의하고 (logger.o에있을 수 있으며 빈 구현을 제공합니다.) 이것은 테스트 파일이 나머지 코드베이스와 독립적으로 컴파일되고 링크되어 독립적으로 실행됨을 의미합니다.

코드를 크로스 컴파일하는 경우이 기능을 사용하려면 대상에 대한 우수한 기능이 필요합니다. PowerPC 아키텍처에서 Linux로 googletest 크로스 컴파일 하여이 작업을 수행했습니다. 결과를 수집하기 위해 전체 쉘과 OS가 있기 때문에 이것은 의미가 있습니다. 덜 풍부한 환경 (전체 OS가없는 것으로 분류)의 경우 호스트에서 빌드하고 실행해야합니다. 어쨌든 빌드의 일부로 테스트를 자동으로 실행할 수 있도록이 작업을 수행해야합니다.

나는 OO 코드가 일반적으로 절차 적보다 훨씬 덜 결합되어 있기 때문에 C ++ 코드 테스트가 훨씬 쉽다는 것을 알았습니다 (물론 이것은 코딩 스타일에 달려 있습니다). 또한 C ++에서는 종속성 주입 및 메서드 재정의와 같은 트릭을 사용하여 캡슐화 된 코드에 이음새를 가져올 수 있습니다.

Michael Feathers는 레거시 코드 테스트에 대한 훌륭한 책을 가지고 있습니다 . 한 장에서 그는 비 OOO 코드를 다루는 기술을 다루는 것이 좋습니다.

편집 : GitHub 에서 소스를 사용할 수있는 단위 테스트 절차 코드에 대한 블로그 게시물을 작성했습니다 .

편집 : Pragmatic Programmers에서 나온 새로운 책 이 있는데 , 특히 제가 추천 하는 단위 테스트 C 코드를 다루고 있습니다.


17
유모차를 사지 마십시오. 음식 책. 이 질문에 대한 답이 아닌 통찰력은 포함되어 있지 않습니다.
Phil

3
나는 C와 C ++이 겹친다는 것을 알고 있지만 궁극적으로 C 컴파일러로 컴파일 될 코드를 생성 할 때 C ++ 테스트 라이브러리를 사용하는 것은 좋은 생각이 아닙니다.
Rafael Almeida 2014

2
본질적으로 @RafaelAlmeida 필자는 여기에 내가 보여주는 것은 extern C에 C include를 포함시키지 않고 전 처리기 이음매라는 점에 동의합니다. 나는 또한 테스트를위한 C 기반 프레임 워크를 작성 했으므로 이것에 대해 독단적이 아닙니다 :) github.com/meekrosoft/fff
mikelong

@ 필자는 동의하지 않습니다. 나는이 책이 특히 C에서 강하지 않은 사람에게 매우 가치있는 것으로 나타났습니다.
CHendrix

위에서 설명한 것처럼 HAL 함수를 조롱하기 위해 Fake Function Framework를 사용하고 있습니다. gTest와 잘 작동합니다. github.com/meekrosoft/fff
레오나르도

135

Minunit 은 매우 간단한 단위 테스트 프레임 워크입니다. avr의 c 마이크로 컨트롤러 코드를 단위 테스트하는 데 사용하고 있습니다.


5
나는 임베디드 시스템에 대한 경험이 없으므로 그것에 대해 언급 할 수는 없지만 작은 C 프로그램 (학업, 스크립트)의 경우 완벽하게 보입니다. 훌륭한 링크.
AndrewKS

3
@ toasted_flakes 나는 이것을 github gist로 만들었습니다 : gist.github.com/sam159/0849461161e86249f849
Sam

이것은 내가 여기에서 검색을 시작하기 전에 생각해 낸 것에 매우 가깝습니다! 테스트를 자동화하여 TEST (funcname, body)가 함수를 만들고 함수에 대한 포인터를 저장하려고하지만 외부 처리가 필요할 것 같습니다.
벤 쿠시 지

41

현재 CuTest 단위 테스트 프레임 워크를 사용하고 있습니다.

http://cutest.sourceforge.net/

매우 가볍고 단순하므로 임베디드 시스템에 이상적입니다. 대상 플랫폼과 데스크탑에서 작동하는 데 아무런 문제가 없었습니다. 단위 테스트를 작성하는 것 외에도 필요한 것은 다음과 같습니다.

  • CuTest 루틴을 호출 할 때마다 포함 된 헤더 파일
  • 이미지에 컴파일 / 링크 할 단일 추가 'C'파일
  • 단위 테스트를 설정하고 호출하기 위해 main에 추가 된 간단한 코드-빌드 중에 UNITTEST가 정의되면 컴파일되는 특수 main () 함수 에이 코드가 있습니다.

시스템은 힙 및 일부 stdio 기능을 지원해야합니다 (일부 임베디드 시스템에는 해당되지 않음). 그러나 코드에는 플랫폼이없는 경우 이러한 요구 사항에 대한 대안으로 작업 할 수있을 정도로 간단합니다.

extern "C"{} 블록을 신중하게 사용하면 C ++ 테스트도 지원합니다.


1
CuTest 투표를 두 번째로하겠습니다. 나는 Nintendo DS에서 homebrew를 개발하기 위해 그것을 사용하고 있었고 그것을 설정하거나 사용하는 데 아무런 어려움이 없었습니다.
Theran

세 번째로하겠습니다. 버전 1.4 일 때 다운로드하여 XML로 덤프하도록 수정했습니다. 다운로드하여보아야 할 버전 1.5가있는 것 같습니다.
Taylor 가격

2
CuTest는 QNX 시스템에서 실행되는 코드를 테스트하는 데 효과적이었습니다.
Jace Browning

그것은 JUnit처럼 작동한다고 주장하지만, 그리워 Before하고 After전화하는 것 같습니다 . 대체로 귀엽습니다.
Dragas

40

나는 ratkok와 거의 동일하게 말하지만 단위 테스트에 포함 된 왜곡이 있다면 ...

Unity -C 코드 단위 테스트를위한 권장 프레임 워크입니다.

이 스레드에서 언급 된 임베디드 C대한 TDD에 나오는 예제는 Unity (및 CppUTest)를 사용하여 작성되었습니다.


5
CMock을 사용한 자동화 된 모의 생성과 결합 된 유니티 는 상당히 좋습니다.
thegreendroid

cmock에 대한 좋은 튜토리얼을 제안 할 수 있습니까?
melwin_jose

CMed 및 Unity에 대한 매우 유용한 자습서가 Ceedling에 의해 조정되었습니다. dmitryfrank.com/articles/unit_testing_embedded_c_applications
Dmitry Frank

35

또한 TAP (Test Anything Protocol)를 출력하고이 기술을 위해 제공되는 다양한 도구와 잘 통합되는 C 테스트 프레임 워크 인 libtap을 살펴볼 수도 있습니다 . 동적 언어 세계에서 주로 사용되지만 사용하기 쉽고 인기가 있습니다.

예를 들면 :

#include <tap.h>

int main () {
    plan(5);

    ok(3 == 3);
    is("fnord", "eek", "two different strings not that way?");
    ok(3 <= 8732, "%d <= %d", 3, 8732);
    like("fnord", "f(yes|no)r*[a-f]$");
    cmp_ok(3, ">=", 10);

    done_testing();
}

나는 내 자신의 프로젝트에 대해 내 자신의 libtap과 동등한 것을 수동으로 굴 렀지 만, 이것이 존재한다는 것을 알았으므로 이제는 더 이상 내 것을 유지할 필요가 없습니다. 멋있는!
ephemient

1
ok(TESTING==IsSimple(), "libtap is super easy to use")
AShelly

26

cmocka 라는 mock 객체를 지원하는 C 용 고급 단위 테스트 프레임 워크가 있습니다. 표준 C 라이브러리 만 필요하며 다양한 컴퓨팅 플랫폼 (내장 포함) 및 다른 컴파일러에서 작동합니다.

또한 Subunit, Test Anything Protocol 및 jUnit XML 보고서와 같은 다양한 메시지 출력 형식을 지원합니다.

cmocka는 임베디드 플랫폼에서도 작동하도록 만들어졌으며 Windows 지원도 제공합니다.

간단한 테스트는 다음과 같습니다.

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(null_test_success),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

API는 완전히 문서화하고 몇 가지 예는 소스 코드의 일부입니다.

cmocka를 시작하려면 LWN.net : C에서 mock 객체를 사용한 단위 테스트 기사를 읽어보십시오.

cmocka 1.0은 2015 년 2 월에 출시되었습니다.


3
cmockery와 cmocka를 보면 문서가 비슷해 보입니다. 이 프로젝트는 관련이 있습니까?
매트 프리드먼

6
cmocka는 cmockery의 후계자입니다. 유지 관리되지 않는 원인으로 포크했습니다.
asn

21

함수를 조롱하는 방법을 찾기 전에는 레거시 C 응용 프로그램을 테스트하지 않았습니다. 테스트하려는 C 파일을 다른 사람과 격리시키기 위해 모의가 필요했습니다. 나는 cmock에게 시도를했고 나는 그것을 채택 할 것이라고 생각한다.

Cmock은 헤더 파일을 스캔하고 찾은 프로토 타입을 기반으로 mock 함수를 생성합니다. Mocks를 사용하면 C 파일을 완벽하게 격리하여 테스트 할 수 있습니다. 테스트 파일을 실제 객체 파일 대신 모의 객체와 연결하기 만하면됩니다.

cmock의 또 다른 장점은 mocked 함수에 전달 된 매개 변수의 유효성을 검사하고 mock이 제공 할 반환 값을 지정할 수 있다는 것입니다. 함수에서 다른 실행 흐름을 테스트하는 데 매우 유용합니다.

테스트는 일반적인 testA (), testB () 함수로 구성됩니다. 여기서 함수는 기대치를 작성하고 함수를 호출하여 어설 션을 테스트하고 확인합니다.

마지막 단계는 단일 테스트로 러너를 생성하는 것입니다. Cmock은 통일 테스트 프레임 워크와 연결되어 있습니다. Unity는 다른 단위 테스트 프레임 워크와 마찬가지로 쉽게 배울 수 있습니다.

시도해 볼 가치가 있고 이해하기 쉽습니다.

http://sourceforge.net/apps/trac/cmock/wiki

업데이트 1

내가 조사하고있는 또 다른 프레임 워크는 Cmockery입니다.

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

단위 테스트 및 조롱을 지원하는 순수한 C 프레임 워크입니다. 루비에 의존하지 않으며 (Cmock과 달리) 외부 라이브러리에 거의 의존하지 않습니다.

코드 생성이 없으므로 모의를 설정하는 데 약간의 수동 작업이 필요합니다. 프로토 타입이 많이 변경되지 않기 때문에 기존 프로젝트에 많은 작업을 나타내는 것은 아닙니다. 추가 타이핑은 목을 완전히 제어합니다. 마음에 들지 않는 것이 있으면 모의를 변경하기 만하면됩니다.

특별한 테스트 러너가 필요 없습니다. 테스트 배열 만 작성하여 run_tests 함수에 전달하면됩니다. 여기에서 좀 더 수동 작업을하지만 자체 포함 된 자율 프레임 워크의 아이디어를 좋아합니다.

또한 내가 알지 못한 멋진 C 트릭이 들어 있습니다.

전반적인 Cmockery를 시작하려면 mock에 대한 이해가 조금 더 필요합니다. 이를 극복하는 데 도움이되는 예제가 있습니다. 더 간단한 기계공으로 작업을 수행 할 수있는 것 같습니다.


8
당신은 cmockery 의 후속 인 cmocka.org 를 살펴 봐야합니다!
asn

cmock에 대한 좋은 튜토리얼을 제안 할 수 있습니까?
melwin_jose

시작 LWN 기사 다음 cmocka의 예 디렉토리를 확인합니다.
asn

16

C 초보자 인 저는 C에서 테스트 주도 개발 이라는 슬라이드가 매우 유용 하다는 것을 알았습니다 . 기본적으로 표준 assert()과 함께 &&외부 종속성없이 메시지를 전달합니다. 누군가가 전체 스택 테스트 프레임 워크에 익숙하다면 아마도 그렇게하지 않을 것입니다 :)


is_spare () 함수의 버그로 너무 귀찮았습니다 ...하지만 링크 주셔서 감사합니다! TDD가 모든 버그를 잡는 것은 아니라고 생각합니다.
Jis Ben

이것은 내가 C에서 보았던 가장 간단한 TDD 접근법으로, assert추가 라이브러리 나 프레임 워크 없이도 따를 수 있습니다 . 나는 당신이 단지 초보자라면 이것이 출발점이 될 수 있다고 생각합니다.
kabirbaidhya

16

우리는 쉬운 사용 성과 이식성을 위해 CHEAT ( GitHub 에서 호스팅 )를 작성 했습니다 .

종속성이 없으며 설치 또는 구성이 필요하지 않습니다. 헤더 파일과 테스트 케이스 만 필요합니다.

#include <cheat.h>

CHEAT_TEST(mathematics_still_work,
    cheat_assert(2 + 2 == 4);
    cheat_assert_not(2 + 2 == 5);
)

테스트는 테스트 실행 및 결과보고를 담당하는 실행 파일로 컴파일됩니다.

$ gcc -I . tests.c
$ ./a.out
..
---
2 successful of 2 run
SUCCESS

예쁜 색상도 있습니다.


예쁜 콜로를위한
공감

12

Cunit의가

그리고 Embedded Unit 은 Embedded C System의 단위 테스트 프레임 워크입니다. 이 디자인은 JUnit 및 CUnit 등에서 복사 한 후 Embedded C 시스템에 맞게 조정되었습니다. 내장 장치에는 표준 C 라이브러리가 필요하지 않습니다. 모든 객체는 const 영역에 할당됩니다.

그리고 Tessy 는 임베디드 소프트웨어의 단위 테스트를 자동화합니다.


1
나는 그것을 시도 embunit하고 실망했다.
Craig McQueen

1
예를 들어, 내가 제출 한 버그 보고서와 3 년 동안 아무런 반응이없는 다른 버그 보고서가 있습니다.
Craig McQueen

12

프레임 워크를 사용하지 않고 autotools "check"대상 지원 만 사용합니다. "메인"을 구현하고 assert를 사용하십시오.

내 테스트 디렉토리 Makefile.am은 다음과 같습니다.

check_PROGRAMS = test_oe_amqp

test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static

TESTS = test_oe_amqp

2
우리는 autotools를 사용하고 있지 않습니다 (그러나 어느 시점에서 넘어가는 것이 좋을 것입니다). 역사적으로 테스트 목적으로 주요 방법을 사용했으며 나쁜 해결책이 아닙니다.
Paul Osborne

11

Michael Feather의 저서 "레거시 코드로 효과적으로 작업하기"는 C 개발 중 단위 테스트와 관련된 많은 기술을 제공합니다.

다른 곳에서는 보지 못한 C와 관련된 의존성 주입과 관련된 기술이 있습니다.



6

임베디드 c / c ++ 환경 (주로 C ++)에 CxxTest 를 사용 합니다.

테스트 러너를 빌드하기 위해 perl / python 스크립트가 있기 때문에 CxxTest를 선호합니다. 설정을하기위한 작은 기울기 (테스트 러너를 작성할 필요가 없기 때문에 더 작은 기울기) 후에는 사용하기 매우 쉽습니다 (샘플 및 유용한 문서 포함). 대부분의 작업은 코드가 액세스하는 '하드웨어'를 설정하는 것이기 때문에 유닛 / 모듈 테스트를 효과적으로 수행 할 수있었습니다. 그 후에는 새로운 단위 테스트 사례를 쉽게 추가 할 수 있습니다.

앞에서 언급했듯이 C / C ++ 단위 테스트 프레임 워크입니다. 따라서 C ++ 컴파일러가 필요합니다.

CxxTest 사용자 안내서 CxxTest Wiki


필요한 컴파일러는 C ++ 일 수 있지만 테스트중인 코드는 여전히 C 일 수 있습니다. CxxTest는 사용하기 매우 쉬운 프레임 워크입니다.
David Sykes


5

Minunit을 읽은 후에 나는 방어 프로그램 기술과 매우 유사한 어설 션 매크로를 기반으로 테스트를하는 것이 더 좋은 방법이라고 생각했습니다. 그래서 나는 표준 단언과 혼합 된 Minunit의 동일한 아이디어를 사용했습니다. k0ga의 블로그 에서 내 프레임 워크 (좋은 이름은 NoMinunit 일 수 있음)를 수 있습니다


나는 지금 내 프로젝트에서 utest.h를 사용하고 있습니다. 잘 작동하고 충분히 도움이됩니다. 감사!
Johan



4

Google은 훌륭한 테스트 프레임 워크를 보유하고 있습니다. https://github.com/google/googletest/blob/master/googletest/docs/primer.md

그리고 네, 내가 아는 한 일반 C와 함께 작동합니다. 즉 C ++ 기능이 필요하지 않습니다 (C ++ 컴파일러가 필요할 수도 있음).


Google의 프레임 워크가 순수한 C에서 작동합니까? 페이지를 간략히 살펴보면 C ++ 프레임 워크임을 알 수 있습니다.
Dana

4
Google 테스트는 훌륭하지만 C ++ 프레임 워크입니다. 이식성이 뛰어나 필요한 경우 C를 테스트하는 데 사용할 수 있습니다.
Josh Kelley


3

먼저 여기를보십시오 : http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C

우리 회사에는 고객이 사용하는 C 라이브러리가 있습니다. 코드를 테스트하기 위해 CxxTest (C ++ 단위 테스트 라이브러리)를 사용합니다. CppUnit도 작동합니다. C에 갇혀 있다면 RCUNIT를 추천합니다 (그러나 CUnit도 좋습니다).


2

JUnit에 익숙하다면 CppUnit을 권장합니다. http://cppunit.sourceforge.net/cppunit-wiki

단위 테스트를 수행하기 위해 c ++ 컴파일러가 있다고 가정합니다. 그렇지 않다면 나는 Adam Rosenfield에 동의해야합니다.


6
문제는 C ++가 아니라 C에 관한 것입니다.
1800 INFORMATION

3
아니요, 그러나 C ++은 C 라이브러리와 인터페이스 할 수 있습니다. 따라서 실제로 C ++ 단위 테스트 프레임 워크를 사용하여 C 라이브러리를 테스트하는 것이 좋습니다. (저희 회사는 그 일을 매우 잘 수행하고 있으며 C 단위 테스트 프레임 워크를 사용하는 것보다 훨씬 쉽습니다.)
Kevin

나는 똑같은 일을한다. C로 작성된 유틸리티 라이브러리는 C ++ 코드와 스크립팅 언어 아래에서 사용합니다. 테스트에 CppUnit을 사용하고 C와 C ++ 모두에 동일한 프레임 워크를 사용할 수 있기 때문에 잘 작동합니다.
Jyaan

2

RCUNIT 을 사용 하여 대상에서 테스트하기 전에 PC에서 임베디드 코드에 대한 단위 테스트를 수행했습니다. 좋은 하드웨어 인터페이스 추상화가 중요합니다. 그렇지 않으면 엔디안과 메모리 매핑 레지스터가 사용자를 죽일 것입니다.



2

API Sanity Checker — C / C ++ 라이브러리를위한 테스트 프레임 워크 :

공유 C / C ++ 라이브러리에 대한 기본 단위 테스트 자동 생성기. 매개 변수에 대한 합리적인 (대부분의 경우는 아니지만 대부분의 경우) 입력 데이터를 생성하고 헤더의 선언 분석을 통해 API의 모든 함수에 대해 간단한 ( "sanity"또는 "shallow"-quality) 테스트 사례를 작성할 수 있습니다. 파일.

생성 된 테스트의 품질을 통해 간단한 사용 사례에서 중대한 오류가 없는지 확인할 수 있습니다. 이 도구는 생성 된 테스트를 빌드 및 실행하고 충돌 (segfault), 중단, 모든 종류의 방출 된 신호, 0이 아닌 프로그램 리턴 코드 및 프로그램 정지를 감지 할 수 있습니다.

예 :


1

사용할 기술 중 하나는 대상 시스템의 소스를 C 모듈로 유지하면서 C ++ xUnit 프레임 워크 (및 C ++ 컴파일러)로 단위 테스트 코드를 개발하는 것입니다.

가능하면 단위 테스트를 통해 크로스 컴파일러에서 C 소스를 정기적으로 컴파일하십시오.


1

LibU ( http://koanlogic.com/libu )에는 명시 적 테스트 스위트 / 케이스 종속성, 테스트 격리, 병렬 실행 및 사용자 정의 가능한 보고서 포맷터 (기본 형식은 xml 및 txt)를 허용하는 단위 테스트 모듈이 있습니다.

라이브러리에는 BSD 라이센스가 있으며 프로젝트에 필요한 경우 네트워킹, 디버깅, 일반적으로 사용되는 데이터 구조, 구성 등과 같은 다른 유용한 모듈이 많이 있습니다 ...




0

여전히 테스트 프레임 워크를 찾고 있다면 CUnitWin32 는 Win32 / NT 플랫폼을위한 것입니다.

이것은 내가 다른 테스트 프레임 워크에 직면 한 하나의 근본적인 문제를 해결합니다. 즉, 전역 / 정적 변수는 각 테스트가 별도의 프로세스로 실행되므로 결정적 상태입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.