programing

유닛 테스트 C 코드

prostudy 2022. 7. 23. 09:33
반응형

유닛 테스트 C 코드

올 여름 C자로 된 임베디드 시스템 작업을 했습니다.그것은 내가 일하는 회사가 인수했던 기존 프로젝트였다.JUnit을 사용하여 Java에서 유닛 테스트를 작성하는 데 익숙해졌지만 시스템에 추가된 새로운 코드뿐만 아니라 기존 코드(리팩터링이 필요함)에 대한 유닛 테스트를 작성하는 최선의 방법이 무엇인지 막막했습니다.

유닛 테스트 플레인 C 코드를 JUnit으로 유닛 테스트 Java 코드만큼 쉽게 할 수 있는 프로젝트가 있습니까?임베디드 개발(Arm-Linux 플랫폼으로의 크로스 컴파일)에 특화된 정보를 제공해 주시면 감사하겠습니다.

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 홈페이지를 참조하십시오.

유닛

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

큐닛

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

CuTest(CuTest)

소스 트리에 드롭하는 .c 파일과 .h 파일이1개뿐인 심플한 프레임워크.CuTest 홈페이지를 참조하십시오.

Cpp 유닛

C++용 프리미어 유닛테스트 프레임워크입니다C 코드 테스트에도 사용할 수 있습니다.안정적이고 활발하게 개발되며 GUI 인터페이스를 갖추고 있습니다.C에 Cpp Unit을 사용하지 않는 주된 이유는 Cpp Unit이 매우 크기 때문입니다.다음으로 테스트를 C++로 작성해야 합니다.즉, C++로 작성해야 합니다.이것이 우려 사항으로 들리지 않는다면 다른 C++ 유닛 테스트 프레임워크와 함께 고려할 가치가 있습니다.CppUnit 홈페이지를 참조해 주세요.

엠브유닛

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

최소 단위

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

안도 씨에게 쿠니트

CUnit의 실장은 상당히 새로운 것으로, 아직 초기 개발 단계에 있는 것이 분명합니다.안도 씨의 홈페이지는 CUnit을 참조하십시오.

이 리스트는 2008년 3월에 마지막으로 갱신되었습니다.

기타 프레임워크:

CMocka

CMocka는 모의 객체를 지원하는 C의 테스트 프레임워크입니다.사용하기 쉽고 셋업도 간단합니다.

CMocka 홈페이지를 참조해 주세요.

기준

Criterion은 자동 테스트 등록, 파라미터화된 테스트, 이론을 지원하는 크로스 플랫폼C 유닛 테스트 프레임워크로, TAP 및 JUnit XML 등 여러 형식으로 출력할 수 있습니다.각 테스트는 자체 프로세스로 실행되므로 필요에 따라 신호 및 크래시를 보고하거나 테스트할 수 있습니다.

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

하드웨어

HWUT는 C를 크게 지원하는 일반적인 유닛 테스트 도구입니다.Makefiles 작성, 최소한의 '반복 테이블'로 코드화된 대규모 테스트 케이스 생성, 상태 머신 이동, C-stub 생성 등에 도움이 됩니다.일반적인 접근법은 매우 독특하다: 평결은 '좋은 stdout/bad stdout'에 근거한다.그러나 비교 기능은 유연합니다.따라서 모든 유형의 스크립트를 체크에 사용할 수 있습니다.표준 출력을 생성할 수 있는 모든 언어에 적용할 수 있습니다.

HWUT 홈페이지를 참조해 주세요.

CG린

C 및 C++를 위한 최신 휴대용 크로스 언어 유닛 테스트 및 모의 프레임워크.옵션인 BDD 표기법, 모의 라이브러리, 단일 프로세스로 실행할 수 있는 기능(디버깅을 쉽게 하기 위해)을 제공합니다.테스트 기능을 자동으로 발견하는 테스트 러너를 사용할 수 있습니다.하지만 프로그래밍 방식으로 직접 만들 수 있습니다.

이러한 모든 기능(및 기타)은 CGREEN 매뉴얼에 설명되어 있습니다.

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

개인적으로 저는 구글 테스트 프레임워크를 좋아합니다.

C 코드 테스트의 가장 큰 어려움은 외부 모듈에 대한 의존 관계를 끊는 것입니다.따라서 코드를 유닛으로 분리할 수 있습니다.이는 레거시 코드에 대한 테스트를 받으려고 할 때 특히 문제가 될 수 있습니다.이 경우 테스트에서 stubs 함수를 사용하기 위해 링커를 사용하는 경우가 많습니다.

이것이 사람들이 ""에 대해 말할 때 언급하는 것입니다.C 에서는, 실제로는 프리프로세서 또는 링커를 사용해 의존 관계를 mockout 하는 것이 유일한 옵션입니다.

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(logger.o에 있을 수 있음)를 시뮬레이션하여 빈 구현을 제공합니다.즉, 테스트파일은 코드베이스의 나머지 부분과는 독립적으로 컴파일 및 링크되어 독립적으로 실행됩니다.

코드 교차 컴파일에 대해서는, 이것을 실시하려면 , 타겟에 좋은 설비가 필요합니다.PowerPC 아키텍처 상에서 Linux로 컴파일된 구글 테스트에서 이 작업을 수행했습니다.결과를 수집하기 위한 완전한 셸과 OS가 있기 때문에 이는 의미가 있습니다.덜 복잡한 환경(전체 OS가 없는 모든 것으로 분류)의 경우 호스트 상에서 구축 및 실행하기만 하면 됩니다.빌드 중에 테스트를 자동으로 실행할 수 있도록 이 작업을 수행해야 합니다.

일반적으로 OO코드의 결합이 절차보다 훨씬 적기 때문에 C++코드의 테스트가 훨씬 쉽다는 것을 알게 되었습니다(물론 이것은 코딩 스타일에 따라 다릅니다).또한 C++에서는 의존성 주입이나 메서드 덮어쓰기 등의 트릭을 사용하여 심을 캡슐화된 코드로 만들 수 있습니다.

마이클 페더스는 레거시 코드를 테스트하는 것에 관한 훌륭한 책을 가지고 있다.한 장에서는 제가 강력히 추천하는 비OO 코드를 다루는 기술을 다룹니다.

편집: 유닛 테스트 절차 코드에 대한 블로그 투고를 작성했습니다.소스는 GitHub에서 입수할 수 있습니다.

편집: Pragmatic Programmers에서 나온 새로운 책이 있습니다.이 책은 특히 유닛 테스트 C 코드를 다루고 있습니다. 코드를 강력히 추천합니다.

Minunit은 믿을 수 없을 정도로 단순한 유닛 테스트 프레임워크입니다.avr에 대한 c 마이크로컨트롤러 코드를 테스트하기 위해 사용하고 있습니다.

래칫콕과 거의 비슷하지만 유닛 테스트에 대한 반전이 있다면...

Unity - 유닛 C 코드 테스트에 강력히 권장되는 프레임워크.

#include <unity.h>

void test_true_should_be_true(void)
{
    TEST_ASSERT_TRUE(true);
}

int main(void)
{
    UNITY_BEGIN();
    RUN_TEST(test_true_should_be_true);
    return UNITY_END();
}

스레드 TDD에 기재되어 있는 임베디드 C의 는 Unity(및 Cpp)를 사용하여 기술되어 있습니다.UTest)

또한 Test Anything Protocol(TAP)을 출력하여 이 기술을 위해 출시되는 다양한 도구와 잘 통합되는 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();
}

사용하기 쉽고 휴대하기 쉽도록 CHITT(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

색깔도 예뻐요.

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

http://cutest.sourceforge.net/

매우 가볍고 심플하기 때문에 임베디드 시스템에 매우 적합합니다.데스크톱뿐만 아니라 타깃 플랫폼에서도 문제없이 사용할 수 있었습니다.유닛 테스트 작성과 더불어 필요한 것은 다음과 같습니다.

  • CuTest 루틴을 호출하는 위치에 포함된 헤더 파일
  • 이미지에 컴파일/링크되는 하나의 추가 'C' 파일
  • 유닛 테스트를 셋업하고 호출하기 위해 main에 몇 가지 간단한 코드가 추가되었습니다.빌드 중에 UNITEST가 정의되면 컴파일되는 특별한 main() 함수에 이 코드가 있습니다.

시스템은 힙 및 일부 표준 기능을 지원해야 합니다(일부 임베디드 시스템이 있는 것은 아닙니다).단, 이 코드는 매우 간단하기 때문에 플랫폼에 이러한 요건이 없는 경우 대체 요건으로 작업할 수 있습니다.

extern "C"{} 블록을 적절히 사용하면 C++ 테스트도 지원합니다.

C에는 cmocka라고 하는 모조 오브젝트를 지원하는 우아한 유닛 테스트 프레임워크가 있습니다.표준 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월에 출시되었습니다.

Michael Feather의 저서 "Legacy Code를 사용한 효과적인 작업"은 C 개발 시 유닛 테스트에 특화된 많은 기술을 제시합니다.

다른 곳에서는 볼 수 없었던 C에 특화된 의존성 주입에 관한 기술이 있습니다.

C 신입사원으로서 C에서 Test drived development라는 슬라이드가 매우 도움이 되었습니다.기본적으로, 그것은 표준적인 것을 사용한다.assert() &&외부 의존 관계 없이 메시지를 전달합니다.프레임워크에 이 되지 않을 수 .

구글은 훌륭한 테스트 프레임워크를 가지고 있다.https://github.com/google/googletest/blob/master/googletest/docs/primer.md

네, C++ 기능은 필요 없습니다(C++ 컴파일러가 필요할 수 있습니다).

레거시 C 어플리케이션을 테스트한 지 얼마 되지 않아 기능을 모사할 수 있는 방법을 찾기 시작했습니다.테스트하고 싶은 C파일을 다른 파일로부터 분리하기 위해 모크가 절실히 필요했습니다.cmock을 시험해 봤는데 채택할 것 같아요.

Cmock은 헤더 파일을 스캔하고 발견된 프로토타입을 기반으로 모의 기능을 생성합니다.Mocks를 사용하면 C 파일을 완전히 분리하여 테스트할 수 있습니다.테스트 파일을 실제 객체 파일이 아닌 mocks와 링크하기만 하면 됩니다.

cmock의 또 다른 장점은 조롱된 함수에 전달된 파라미터를 검증하여 mock이 제공해야 할 반환값을 지정할 수 있다는 것입니다.이는 함수에서 다양한 실행 흐름을 테스트할 때 매우 유용합니다.

테스트는 일반적인 testA() 함수, testB() 함수로 구성됩니다.이 함수는 기대치를 구축하고 테스트 및 어사트를 체크하기 위한 함수를 호출합니다.

마지막 단계는 단합된 테스트용 러너를 생성하는 것입니다.Cmock은 유니티 테스트 프레임워크에 연결되어 있습니다.Unity는 다른 유닛 테스트 프레임워크와 마찬가지로 배우기 쉽습니다.

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

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

업데이트 1

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

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

유닛 테스트와 조롱을 지원하는 순수한 C 프레임워크입니다.루비(Cmock과 반대)에 의존하지 않고 외부 lib에 의존하지 않습니다.

코드 생성은 이루어지지 않기 때문에 mock을 셋업하려면 조금 더 수작업이 필요합니다.프로토타입은 큰 변화가 없기 때문에 기존 프로젝트에서 많은 작업을 수행할 수 없습니다. 일단 모크가 있으면 당분간은 변경할 필요가 없습니다(이 경우는).추가 입력으로 모크를 완전히 제어할 수 있습니다.마음에 안 드는 게 있으면 그냥 흉내만 내요.

특별한 테스트 주자가 필요하지 않습니다.테스트 배열을 생성하여 run_tests 함수에 전달하기만 하면 됩니다.여기서도 조금 더 수작업이 필요하지만, 나는 확실히 자급자족적인 자율 프레임워크의 아이디어가 마음에 든다.

게다가 내가 몰랐던 멋진 C 트릭도 들어있어.

전체적인 Cmockery를 시작하려면 mockes에 대한 이해가 조금 더 필요합니다.예를 들면, 이것을 극복하는데 도움이 될 것입니다.그것은 더 간단한 기계로 일을 할 수 있을 것 같다.

프레임워크는 사용하지 않고 자동 툴 대상 지원만 사용합니다."메인"을 구현하고 assert를 사용합니다.

테스트 dir 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

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

공유 C/C++ 라이브러리에 대한 기본 장치 테스트 자동 생성기.헤더 파일의 선언 분석을 통해 파라미터에 대한 합리적인 입력 데이터(대부분, 불행하게도 전부는 아님)를 생성하고 API의 모든 함수에 대해 간단한("온전성" 또는 "낮은" 품질의 테스트 케이스를 구성할 수 있습니다.

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

예:

큐닛이 있습니다.

Embedded Unit은 Embedded C 시스템의 유닛 테스트 프레임워크입니다.JUnit, CUnit 등에서 디자인을 모방하여 Embedded C System용으로 다소 수정하였습니다.Embedded Unit에는 표준 Clibs가 필요하지 않습니다.모든 객체는 const 영역에 할당됩니다.

또한 Tessy는 임베디드 소프트웨어의 유닛 테스트를 자동화합니다.

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

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

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

CppUTest - 유닛 C 코드 테스트에 강력히 권장되는 프레임워크.

스레드 TDD에 기재되어 있는 임베디드 C의 는 Cpp를 사용하여 기술되어 있습니다.UTest.

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

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

앞에서 설명한 바와 같이 C/C++ 유닛 테스트 프레임워크입니다.따라서 C++ 컴파일러가 필요합니다.

CxxTest 사용자 가이드 CxxTest Wiki

나의 명백한 편견 말고는

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

C 코드를 테스트하는 매우 간단한 방법입니다.xUnit을 모방합니다.

Minunit을 읽고 나는 방어적인 프로그램 기법처럼 많이 사용하는 아사트 매크로를 기반으로 하는 것이 더 좋은 방법이라고 생각했다.그래서 나는 Minunit과 표준적인 주장이 섞인 같은 아이디어를 사용했다.k0ga의 블로그에서 나의 프레임워크(좋은 이름은 No Minunit일 수도 있음)를 볼 수 있습니다.

Cmockery는 쓰기 유닛 테스트에 사용하기 쉬운 C 라이브러리로 구성된 최근 출시된 프로젝트입니다.

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

저희 회사에는 고객들이 사용하는 C 라이브러리가 있습니다.코드 테스트에는 CxxTest(C++ 유닛 테스트 라이브러리)를 사용합니다.Cpp Unit도 동작합니다.C에 갇힌다면 RCUNIT을 추천합니다(하지만 CUnit도 좋습니다).

타깃 테스트 전에 RCUNIT을 사용하여 PC에 내장된 코드를 테스트했습니다.적절한 하드웨어 인터페이스 추상화가 중요합니다.그렇지 않으면 엔디안이나 메모리 맵 레지스터에 문제가 생깁니다.

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

사용하는 기술 중 하나는 C++ xUnit 프레임워크(및 C++ 컴파일러)를 사용하여 유닛테스트 코드를 개발하는 것입니다.

가능한 경우 장치 테스트를 통해 C 소스를 정기적으로 크로스 컴파일러로 컴파일하십시오.

LibU(http://koanlogic.com/libu)에는 명시적인 테스트 스위트/케이스 의존관계, 테스트 분리, 병렬 실행 및 커스터마이즈 가능한 보고서 포맷(기본 형식은 xml 및 txt)이 있는 유닛 테스트모듈이 있습니다.

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

아무도 Cutter에 대해 언급하지 않은 것에 놀랐습니다(http://cutter.sourceforge.net/) C와 C++를 테스트할 수 있습니다.자동 툴과 심리스하게 통합되어 매우 훌륭한 튜토리얼이 준비되어 있습니다.

Win32 플랫폼 또는 NT 커널 모드를 대상으로 하는 경우 cfix를 확인해야 합니다.

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

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

언급URL : https://stackoverflow.com/questions/65820/unit-testing-c-code

반응형