문제

나는 이번 여름에 C로 작성된 임베디드 시스템에 대해 작업했습니다.제가 일하는 회사가 인수한 기존 프로젝트였습니다.나는 JUnit을 사용하여 Java에서 단위 테스트를 작성하는 데 상당히 익숙해졌지만 기존 코드(리팩토링이 필요함)와 시스템에 추가된 새 코드에 대한 단위 테스트를 작성하는 가장 좋은 방법에 대해 고민했습니다.

예를 들어, Java 코드를 단위 테스트하는 것만큼 쉽게 일반 C 코드 단위 테스트를 수행할 수 있는 방법이 있습니까? JUnit?특히 임베디드 개발(arm-linux 플랫폼으로의 크로스 컴파일)에 적용할 수 있는 통찰력을 주시면 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

C의 한 단위 테스트 프레임워크는 다음과 같습니다. 확인하다;C의 단위 테스트 프레임워크 목록을 찾을 수 있습니다. 여기 아래에 재현되어 있습니다.런타임에 포함된 표준 라이브러리 함수 수에 따라 해당 기능 중 하나를 사용할 수도 있고 사용하지 못할 수도 있습니다.

에이스유닛

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

GNU 오토유닛

별도의 주소 공간에서 단위 테스트를 실행하기 위해 분기하는 것을 포함하여 Check와 거의 같은 방식입니다(사실 Check의 원 작성자는 GNU Autounit에서 아이디어를 빌렸습니다).GNU Autounit은 GLib를 광범위하게 사용합니다. 이는 연결 등에 특별한 옵션이 필요하다는 것을 의미합니다. 그러나 이는 특히 GTK 또는 GLib를 이미 사용하고 있는 경우에는 큰 문제가 아닐 수 있습니다.참조 GNU 오토유닛 홈페이지.

c단위

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

CUnit

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

CuTest

소스 트리에 놓을 수 있는 .c 파일과 .h 파일이 하나만 있는 간단한 프레임워크입니다.참조 CuTest 홈페이지.

Cpp단위

C++용 최고의 단위 테스트 프레임워크입니다.C 코드를 테스트하는 데에도 사용할 수 있습니다.안정적이고 적극적으로 개발되었으며 GUI 인터페이스를 갖추고 있습니다.C용 CppUnit을 사용하지 않는 주된 이유는 첫째로 그것이 상당히 크다는 것과 둘째로 테스트를 C++로 작성해야 하기 때문입니다. 이는 C++ 컴파일러가 필요하다는 것을 의미합니다.이것이 문제가 되지 않는다면 다른 C++ 단위 테스트 프레임워크와 함께 고려해 볼 가치가 있습니다.참조 CppUnit 홈페이지.

embUnit

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

최소단위

최소한의 매크로 세트가 전부입니다!요점은 코드를 단위 테스트하는 것이 얼마나 쉬운지 보여주는 것입니다.참조 미니유닛 홈페이지.

Mr.를 위한 CUnit안도

상당히 새롭고 아직 초기 개발 단계인 CUnit 구현입니다.참조 Mr.를 위한 CUnit안도 홈페이지.

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

더 많은 프레임워크:

C모카

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

보다 CMocka 홈페이지.

표준

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

참조 기준 홈페이지 자세한 내용은.

흐우트

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

보다 HWUT 홈페이지.

C녹색

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

모든 기능(및 그 이상)은 다음에 설명되어 있습니다. CGreen 매뉴얼.

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

다른 팁

개인적으로 나는 다음을 좋아한다. 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가 없는 환경으로 분류)의 경우 호스트에서 빌드하고 실행하면 됩니다.어쨌든 이 작업을 수행해야 빌드의 일부로 테스트를 자동으로 실행할 수 있습니다.

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

마이클 페더스는 레거시 코드 테스트에 관한 훌륭한 책.한 장에서 그는 내가 적극 권장하는 비OO 코드를 처리하는 기술을 다룹니다.

편집하다:나는 다음을 썼다. 블로그 게시물 단위 테스트 절차 코드에 대해 GitHub에서 사용 가능한 소스.

편집하다:이있다 Pragmatic Programmers에서 나온 새 책 이는 구체적으로 단위 테스트 C 코드를 다루는 것입니다. 나는 강력히 추천한다.

분단위 믿을 수 없을 정도로 간단한 단위 테스트 프레임워크입니다.나는 avr에 대한 C 마이크로 컨트롤러 코드를 단위 테스트하는 데 사용하고 있습니다.

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

http://cutetest.sourceforge.net/

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

  • 가장 귀여운 루틴을 부르는 곳마다 포함 된 헤더 파일
  • 컴파일/이미지에 연결할 단일 추가 'C'파일
  • 단위 테스트를 설정하고 호출하기 위해 메인에 추가 된 일부 간단한 코드 - 빌드 중에 UnitTest가 정의되면 컴파일되는 특수 Main () 함수에 있습니다.

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

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

나는 ratkok과 거의 동일하다고 말하지만 단위 테스트에 변형이 포함되어 있다면...

단일성 - C 코드 단위 테스트에 적극 권장되는 프레임워크입니다.

이 스레드에 언급된 책의 예 임베디드 C를 위한 TDD Unity(및 CppUTest)를 사용하여 작성되었습니다.

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

예:

#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();
}

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에서 모의 ​​객체를 사용한 단위 테스트

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

나는 함수를 모의하는 방법을 찾기 전에 레거시 C 애플리케이션을 많이 테스트하지 않았습니다.테스트하려는 C 파일을 다른 파일과 분리하기 위해 모의 파일이 심하게 필요했습니다.나는 cmock을 사용해 보았고 그것을 채택할 것이라고 생각합니다.

Cmock은 헤더 파일을 스캔하고 찾은 프로토타입을 기반으로 모의 함수를 생성합니다.Mocks를 사용하면 C 파일을 완벽하게 격리하여 테스트할 수 있습니다.당신이 해야 할 일은 실제 개체 파일 대신 테스트 파일을 모의 파일과 연결하는 것뿐입니다.

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

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

마지막 단계는 통합된 테스트를 위한 실행기를 생성하는 것입니다.Cmock은 통합 테스트 프레임워크에 연결되어 있습니다.Unity는 다른 단위 테스트 프레임워크만큼 배우기 쉽습니다.

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

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

업데이트 1

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

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

단위 테스트 및 조롱을 지원하는 순수 C 프레임워크입니다.Cmock과 달리 Ruby에 대한 종속성이 없으며 외부 라이브러리에 대한 종속성이 거의 없습니다.

코드 생성이 없기 때문에 모의를 설정하려면 좀 더 수동 작업이 필요합니다.프로토타입은 크게 변경되지 않으므로 이는 기존 프로젝트에 대한 많은 작업을 나타내지 않습니다.모의 모형이 있으면 한동안 변경할 필요가 없습니다(제 경우입니다).추가 타이핑을 통해 모의 객체를 완벽하게 제어할 수 있습니다.마음에 들지 않는 것이 있으면 모형을 변경하면 됩니다.

특별한 테스트 러너가 필요하지 않습니다.테스트 배열을 만들고 이를 run_tests 함수에 전달하기만 하면 됩니다.여기서도 수동 작업이 좀 더 많이 필요하지만 저는 독립형 자율 프레임워크라는 아이디어를 확실히 좋아합니다.

게다가 내가 몰랐던 몇 가지 멋진 C 트릭도 포함되어 있습니다.

전반적으로 Cmockery를 시작하려면 모의 객체에 대해 좀 더 이해해야 합니다.예제는 이 문제를 극복하는 데 도움이 될 것입니다.간단한 기계 장치로 작업을 수행할 수 있을 것 같습니다.

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

있다 CUnit

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

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

저는 프레임워크를 사용하지 않고 단지 autotools의 "확인" 대상 지원을 사용합니다."main"을 구현하고 주장을 사용하십시오.

내 테스트 디렉토리 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

우리는 썼다 속이다 (호스팅 날짜: 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

예쁜 색상도 있어요.

Michael Feather의 저서 "Working Effectively with Legacy Code"에서는 C 개발 중 단위 테스트와 관련된 많은 기술을 제시합니다.

다른 곳에서는 본 적이 없는 C에만 적용되는 종속성 주입과 관련된 기술이 있습니다.

CppUTest - C 코드 단위 테스트에 적극 권장되는 프레임워크입니다.

이 스레드에 언급된 책의 예 임베디드 C를 위한 TDD CppUTest를 사용하여 작성되었습니다.

나는 사용한다 Cxx테스트 임베디드 c/C++ 환경(주로 C++)의 경우.

나는 테스트 실행기를 구축하기 위한 perl/python 스크립트가 있기 때문에 CxxTest를 선호합니다.설정을 위한 작은 경사면(테스트 실행기를 작성할 필요가 없으므로 여전히 더 작음)을 사용하면 사용하기가 매우 쉽습니다(샘플 및 유용한 문서 포함).가장 많은 작업은 단위/모듈 테스트를 효과적으로 수행할 수 있도록 코드가 액세스하는 '하드웨어'를 설정하는 것이었습니다.그 후에는 새로운 단위 테스트 사례를 쉽게 추가할 수 있습니다.

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

CxxTest 사용자 가이드 CxxTest 위키

내 명백한 편견 외에는

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

C 코드를 단위 테스트하는 좋은 간단한 방법입니다.xUnit을 흉내낸다

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

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

그리고 그렇습니다. 제가 보기에는 일반 C에서도 작동할 것입니다.C++ 기능이 필요하지 않습니다(C++ 컴파일러가 필요할 수도 있지만 확실하지 않음).

조롱 단위 테스트 작성을 위해 사용하기 매우 간단한 C 라이브러리로 구성된 최근에 시작된 프로젝트입니다.

먼저 여기를 보세요: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C

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

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

이는 단위 테스트를 수행하기 위한 C++ 컴파일러가 있다고 가정합니다.그렇지 않다면 나는 수표가 당신이 원하는 것이라는 Adam Rosenfield의 의견에 동의해야 합니다.

나는 사용했다 RCUNIT 대상에서 테스트하기 전에 PC에서 임베디드 코드에 대한 단위 테스트를 수행합니다.좋은 하드웨어 인터페이스 추상화가 중요합니다. 그렇지 않으면 엔디안과 메모리 매핑 레지스터로 인해 문제가 발생할 수 있습니다.

lcut을 시도해보세요!- http://code.google.com/p/lcut

API 온전성 검사기 — C/C++ 라이브러리용 테스트 프레임워크:

공유 C/C++ 라이브러리에 대한 기본 단위 테스트의 자동 생성기입니다.매개변수에 대한 합리적인(대부분의 경우이지만 전부는 아님) 입력 데이터를 생성하고 헤더 선언 분석을 통해 API의 모든 기능에 대한 간단한("온전성" 또는 "얕은" 품질) 테스트 케이스를 구성할 수 있습니다. 파일.

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

예:

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

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

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

라이브러리는 BSD 라이센스가 있으며 네트워킹, 디버깅, 일반적으로 사용되는 데이터 구조, 구성 등 많은 유용한 모듈을 포함합니다.- 프로젝트에 필요하다면 ...

아무도 언급하지 않아서 놀랐어요 커터 (http://cutter.sourceforge.net/)C와 C++를 테스트할 수 있으며, autotools와 원활하게 통합되며 정말 멋진 튜토리얼이 제공됩니다.

Win32 플랫폼이나 NT 커널 모드를 대상으로 하는 경우 다음을 살펴봐야 합니다. cfix.

아직도 테스트 프레임워크를 찾고 있다면, CUnitWin32 Win32/NT 플랫폼용입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top