문제

고 싶할 수 있 단위 테스트 Arduino 코드입니다.이상적으로,내가 실행될 수 있는 어떤 테스트가하지 않고 업로드하는 코드를 Arduino.도구는 무엇인이나 라이브러리할 수 있게 도와 함께 이?

아두이노에서 에뮬레이터를 개발 는 도움이 될 수 있지만,그것하지 않은 것을 사용할 준비가 되었습니다.

AVR Studio 부터 Atmel 포함되어 칩 시뮬레이터는 도움이 될 수 있지만,나는 볼 수 없는 방법을 사용하는 것 그것은에서와 함께 아두이노 IDE 입니다.

도움이 되었습니까?

해결책 2

Arduino의 기존 단위 테스트 프레임 워크가 없으면 Arduinounit. 다음은 사용을 보여주는 간단한 Arduino 스케치입니다.

#include <ArduinoUnit.h>

// Create test suite
TestSuite suite;

void setup() {
    Serial.begin(9600);    
}

// Create a test called 'addition' in the test suite
test(addition) {
    assertEquals(3, 1 + 2);
}

void loop() {
    // Run test suite, printing results to the serial port
    suite.run();
}

다른 팁

Arduino 장치 또는 에뮬레이터에서 단위 테스트를 실행하지 마십시오.

마이크로 컨트롤러 장치/에뮬레이터/SIM 기반 테스트에 대한 사례

무엇에 대한 많은 토론이 있습니다 단위 테스트 의미 있고 나는 여기서 그것에 대해 논쟁을하려고하지 않습니다. 이 게시물입니다 ~ 아니다피하라고 말합니다 모두 궁극적 인 대상 하드웨어에 대한 실질적인 테스트. 가장 평범하고 빈번한 테스트에서 대상 하드웨어를 제거하여 개발 피드백주기를 최적화하는 것에 대해 지적하려고합니다. 시험중인 장치는 전체 프로젝트보다 훨씬 작다고 가정합니다.

단위 테스트의 목적은 자신의 코드의 품질을 테스트하는 것입니다. 단위 테스트는 일반적으로 제어 외부의 요인의 기능을 테스트하지 않아야합니다.

이런 식으로 생각하십시오 : Arduino 라이브러리, 마이크로 컨트롤러 하드웨어 또는 에뮬레이터의 기능을 테스트하더라도 절대적으로 불가능합니다 그러한 테스트 결과가 자신의 작업의 품질에 대해 무엇이든 이야기 할 수 있습니다. 따라서 대상 장치 (또는 에뮬레이터)에서 실행되지 않는 단위 테스트를 작성하는 것이 훨씬 더 가치 있고 효율적입니다.

대상 하드웨어의 빈번한 테스트는 고통스럽게 느린 사이클입니다.

  1. 코드를 조정하십시오
  2. Arduino 장치로 컴파일하고 업로드하십시오
  3. 행동을 관찰하고 여부를 추측하십시오 당신의 코드는 당신이 기대하는 일을하고 있습니다
  4. 반복하다

일련 포트를 통해 진단 메시지를받을 것으로 예상되면 3 단계는 특히 불쾌하지만 프로젝트 자체는 Arduino의 유일한 하드웨어 직렬 포트를 사용해야합니다. 소프트웨어 라이브러리가 도움이 될 수 있다고 생각한다면, 다른 신호를 동시에 생성하는 것과 같은 정확한 타이밍이 필요한 기능을 방해 할 가능성이 있음을 알아야합니다. 이 문제는 나에게 일어났다.

다시 한 번, 에뮬레이터를 사용하여 스케치를 테스트하고 실제 Arduino에 업로드 할 때까지 시간 크리티컬 루틴이 완벽하게 달렸다면, 배울 수있는 유일한 교훈은 에뮬레이터에 결함이 있다는 것입니다. 공개 아무것도 아님 품질에 대해 너 스스로 일하다.

장치 나 에뮬레이터에서 테스트하는 것이 어리석은 경우 ~해야 한다 그래요?

Arduino 프로젝트에서 작업하기 위해 컴퓨터를 사용하고있을 것입니다. 그 컴퓨터는 마이크로 컨트롤러보다 더 빠른 크기 순서입니다. 구축 할 테스트를 작성하십시오 컴퓨터에서 실행하십시오.

Arduino 라이브러리와 마이크로 컨트롤러의 행동은 정확하거나 적어도 적어도 가정합니다 일관되게 잘못된.

테스트가 기대에 위배되는 출력을 생성하면 테스트 된 코드에 결함이있을 수 있습니다. 테스트 출력이 기대치와 일치하지만 Arduino에 업로드 할 때 프로그램이 올바르게 작동하지 않으면 테스트가 잘못된 가정을 기반으로하고 결함이있는 테스트가 있음을 알 수 있습니다. 두 경우 모두 다음 코드 변경이 무엇인지에 대한 실질적인 통찰력을 얻게 될 것입니다. 피드백의 품질은 "무엇 "TO"가 깨졌습니다 "이것 특정 코드 깨졌다 ".

PC에서 테스트를 구축하고 실행하는 방법

가장 먼저해야 할 일은입니다 테스트 목표를 식별하십시오. 어떤 부분에 대해 생각하십시오 자신의 코드 당신은 당신이 할 수있는 방식으로 테스트 한 다음 프로그램을 구성하려고합니다. 이산 부품을 분리하십시오 시험용.

테스트하려는 부품이 Arduino 기능을 호출하는 경우 테스트 프로그램에서 모형 교체품을 제공해야합니다. 이것은 보이는 것보다 훨씬 적은 작업입니다. 모형은 실제로 아무것도 할 필요는 없지만 테스트에 예측 가능한 입력 및 출력을 제공합니다.

테스트하려는 자신의 코드 중 하나는 .pde 스케치 이외의 소스 파일에 존재해야합니다. 걱정하지 마십시오. 스케치 외부의 소스 코드가 있어도 스케치는 여전히 컴파일됩니다. 실제로 내려 가면 프로그램의 일반 진입 점보다 스케치 파일에 정의되어야합니다.

남아있는 것은 실제 테스트를 작성한 다음 좋아하는 C ++ 컴파일러를 사용하여 컴파일하는 것입니다! 이것은 아마도 실제 예제로 가장 잘 설명 될 것입니다.

실제 작업 예

내 애완 동물 프로젝트 중 하나가 발견되었습니다 여기 PC에서 실행되는 간단한 테스트가 있습니다. 이 답변 제출을 위해 Arduino 라이브러리 기능과 그 모형을 테스트하기 위해 쓴 테스트를 어떻게 조롱하는지 살펴 보겠습니다. 이것은 내가 모형을 쓴 사람 이었기 때문에 다른 사람들의 코드를 테스트하지 않는 것에 대해 이전에 말한 것과 상반되지 않습니다. 나는 내 모형이 정확하다는 것을 확신하고 싶었다.

Arduino 라이브러리에서 제공하는 일부 지원 기능을 복제하는 코드가 포함 된 Mock_arduino.cpp의 출처 :

#include <sys/timeb.h>
#include "mock_arduino.h"

timeb t_start;
unsigned long millis() {
  timeb t_now;
  ftime(&t_now);
  return (t_now.time  - t_start.time) * 1000 + (t_now.millitm - t_start.millitm);
}

void delay( unsigned long ms ) {
  unsigned long start = millis();
  while(millis() - start < ms){}
}

void initialize_mock_arduino() {
  ftime(&t_start);
}

코드가 하드웨어 직렬 장치에 이진 데이터를 작성할 때 다음 모형을 사용하여 읽을 수있는 출력을 생성합니다.

가짜 _serial.h

#include <iostream>

class FakeSerial {
public:
  void begin(unsigned long);
  void end();
  size_t write(const unsigned char*, size_t);
};

extern FakeSerial Serial;

가짜 _serial.cpp

#include <cstring>
#include <iostream>
#include <iomanip>

#include "fake_serial.h"

void FakeSerial::begin(unsigned long speed) {
  return;
}

void FakeSerial::end() {
  return;
}

size_t FakeSerial::write( const unsigned char buf[], size_t size ) {
  using namespace std;
  ios_base::fmtflags oldFlags = cout.flags();
  streamsize oldPrec = cout.precision();
  char oldFill = cout.fill();

  cout << "Serial::write: ";
  cout << internal << setfill('0');

  for( unsigned int i = 0; i < size; i++ ){
    cout << setw(2) << hex << (unsigned int)buf[i] << " ";
  }
  cout << endl;

  cout.flags(oldFlags);
  cout.precision(oldPrec);
  cout.fill(oldFill);

  return size;
}

FakeSerial Serial;

마지막으로 실제 테스트 프로그램 :

#include "mock_arduino.h"

using namespace std;

void millis_test() {
  unsigned long start = millis();
  cout << "millis() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    sleep(1);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void delay_test() {
  unsigned long start = millis();
  cout << "delay() test start: " << start << endl;
  while( millis() - start < 10000 ) {
    cout << millis() << endl;
    delay(250);
  }
  unsigned long end = millis();
  cout << "End of test - duration: " << end - start << "ms" << endl;
}

void run_tests() {
  millis_test();
  delay_test();
}

int main(int argc, char **argv){
  initialize_mock_arduino();
  run_tests();
}

이 게시물은 충분히 길다. Github에 대한 나의 프로젝트 더 많은 테스트 사례를 보려면 작동합니다. 나는 진행중인 작업을 마스터 이외의 다른 지점에 보관하므로 해당 지점에서 추가 테스트를 확인하십시오.

나는 내 자신의 경량 테스트 루틴을 작성하기로 결정했지만 CPPUnit과 같은보다 강력한 단위 테스트 프레임 워크도 사용할 수 있습니다.

하드웨어 액세스를 추상화하고 테스트에서 조롱하여 사진 코드를 테스트하는 성공 단위가 상당히 성공적입니다.

예를 들어, 나는 porta를 추상화합니다

#define SetPortA(v) {PORTA = v;}

그런 다음 PIC 버전에 오버 헤드 코드를 추가하지 않고 Setporta를 쉽게 조롱 할 수 있습니다.

하드웨어 추상화가 한동안 테스트되면 곧 코드가 테스트 리그에서 그림으로 이동하여 처음으로 작동한다는 것을 알게됩니다.

업데이트:

테스트 리그의 C ++ 파일의 단위 코드와 대상 코드의 C 파일을 포함하여 단위 코드에 #include Seam을 사용합니다.

예를 들어 4 개의 7 세그먼트 디스플레이, 세그먼트를 구동하는 하나의 포트 및 디스플레이를 선택하는 두 번째 포트를 다중화하려고합니다. 디스플레이 코드는 디스플레이를 통해 인터페이스합니다 SetSegmentData(char) 그리고 SetDisplay(char). C ++ 테스트 장비에서 이것을 조롱하고 내가 기대하는 데이터를 얻는 것을 확인할 수 있습니다. 내가 사용하는 대상을 위해 #define 함수 호출의 오버 헤드없이 직접 할당을 받도록

#define SetSegmentData(x) {PORTA = x;}

그것은 것 같습니다 이물 리노 일을 완벽하게 할 것입니다.

Emulino는 Greg Hewgill의 Arduino 플랫폼의 에뮬레이터입니다. (원천)

Github 저장소

시바르 AVR입니다 모의 실험 장치 AVR-GCC 사용.

이미 몇 가지 Attiny 및 Atmega 마이크로 컨트롤러를 지원하며 저자에 따르면 더 쉽게 추가하기가 쉽습니다.

예에는 Arduino 에뮬레이터 인 Simduino가 있습니다. Arduino Bootloader 실행을 지원하며 Avrdude를 통해 프로그래밍 할 수 있습니다. 소사이어티 (수정 된 netcat).

내 프로젝트와 함께 파이썬으로 테스트 할 수 있습니다. pysimavr. 아스콘 건축 및 시바르 시뮬레이션을 위해.

예시:

from pysimavr.sim import ArduinoSim    
def test_atmega88():
    mcu = 'atmega88'
    snippet = 'Serial.print("hello");'

    output = ArduinoSim(snippet=snippet, mcu=mcu, timespan=0.01).get_serial()
    assert output == 'hello'

테스트 시작 :

$ nosetests pysimavr/examples/test_example.py
pysimavr.examples.test_example.test_atmega88 ... ok

Arduino 코드를 테스트 할 수있는 플랫폼을 모릅니다.

그러나 프리 츠 하드웨어를 모델링하고 나중에 PCB 다이어그램 및 물건을 내보내는 데 사용할 수있는 플랫폼.

확인할 가치가 있습니다.

우리는 대규모 과학 실험에서 데이터 수집을 위해 Arduino 보드를 사용하고 있습니다. 그 후, 우리는 구현이 다른 여러 Arduino 보드를 지원해야합니다. 나는 단위 테스트 중에 Arduino Hex 이미지를 동적으로로드하기 위해 Python 유틸리티를 작성했습니다. 아래 링크에있는 코드는 구성 파일을 통해 Windows 및 Mac OS X를 지원합니다. Arduino IDE에서 육각 이미지를 어디에 배치하는지 알아 보려면 빌드 (재생) 버튼을 누르기 전에 Shift 키를 누르십시오. AVRDUDE (Command Line Upload Utility)가 Arduino의 시스템 / 버전에 위치한 위치를 찾으려면 업로드를 치는 동안 Shift 키를 누르십시오. 또는 포함 된 구성 파일을보고 설치 위치를 사용할 수 있습니다 (현재 Arduino 0020).

http://github.com/toddstavish/python-arduino-unit-testing

이 프로그램을 통해 여러 Arduino 장치 테스트를 자동으로 실행할 수 있습니다. 테스트 프로세스는 PC에서 시작되지만 테스트는 실제 Arduino 하드웨어에서 실행됩니다. 하나의 단위 테스트 세트는 일반적으로 하나의 Arduino 라이브러리를 테스트하는 데 사용됩니다. (이것

Arduino 포럼 : http://arduino.cc/forum/index.php?topic=140027.0

Github 프로젝트 페이지 : http://jeroendoggen.github.com/arduino-testsuite

Python 패키지 색인의 페이지 : http://pypi.python.org/pypi/arduino_testsuite

단위 테스트는 "Arduino Unit Testing Library"로 작성되었습니다. http://code.google.com/p/arduinounit

각 단위 테스트 세트에 대해 다음 단계가 수행됩니다.

  • 실행할 테스트를 찾으려면 구성 파일을 읽으십시오.
  • 스크립트는 단위 테스트 코드가 포함 된 Arduino 스케치를 컴파일하고 업로드합니다.
  • 단위 테스트는 Arduino 보드에서 실행됩니다.
  • 테스트 결과는 직렬 포트에 인쇄되어 Python 스크립트로 분석됩니다.
  • 스크립트는 다음 테스트를 시작하여 구성 파일에 요청 된 모든 테스트에 대한 위의 단계를 반복합니다.
  • 이 스크립트는 전체 테스트 수영에서 실패/전달 된 테스트에 대한 개요를 보여주는 요약을 인쇄합니다.

하드웨어 관련 코드 별도 또는 추상화된다 나머지 부분에서 테스트할 수 있도록 디버깅하는 더 큰"나머지"어떤 플랫폼에서 당신은 좋은 도구와 함께 당신에 익숙한다.

기본적으로 구축하려고 많은 최종의 코드에서는 많은 알려진 일자리 빌딩 블록으로 가능합니다.나머지는 하드웨어-특정 작동 될 것이 훨씬 더 쉽고 빠릅니다.당신이 그것을 완료를 사용하여 기존 에뮬레이터 및/또는 모방 기기에 당신의 자신입니다.그리고,물론 당신은 필요한 테스트 실습니다.에 따라 상황에서,지 않을 수도 있습니다 아주 잘 오토메이션(i.e누가 또 무엇이 버튼을 누르고 입력?누가 또 무엇을 준수하고 해석하는 다양한 표시 및 출력?).

James W. Grenning은 훌륭한 책을 씁니다.이 책은 단위 테스트 임베디드 C 코드에 관한 것입니다. 임베디드에 대한 테스트 구동 개발 c.

나는 사용 중입니다 시어 도노 Arduino 코드를 작성할 때. Searduino는 Arduino 시뮬레이터 및 개발 환경 (MakeFiles, C Code ...)으로 좋아하는 편집기를 사용하여 C/C ++에서 쉽게 해킹 할 수 있습니다. Arduino 스케치를 가져 와서 시뮬레이터에서 실행할 수 있습니다.

Searduino 0.8의 스크린 샷 : http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png

Searduino 0.9가 출시되고 마지막 테스트가 완료 되 자마자 비디오가 녹음됩니다 .... 하루나 이틀 안에.

시뮬레이터에 대한 테스트는 실제 테스트로 간주되어서는 안되지만, 멍청한/논리적 실수를 찾는 데 많은 도움이되었습니다 (잊어 버린 것 pinMode(xx, OUTPUT), 등.).

BTW : 저는 Searduino를 개발하는 사람들 중 하나입니다.

내가 지 었지 arduino_ci 이 목적을 위해. Arduino 라이브러리 테스트 (독립형 스케치가 아님)로 제한되지만 단위 테스트는 로컬 또는 CI 시스템 (Travis CI 또는 Appveyor)에서 실행할 수 있습니다.

Arduino 라이브러리 디렉토리에서 매우 간단한 라이브러리를 고려하십시오. DoSomething, 와 함께 do-something.cpp:

#include <Arduino.h>
#include "do-something.h"

int doSomething(void) {
  return 4;
};

다음과 같이 단위 테스트를 할 것입니다 (테스트 파일로 test/is_four.cpp 또는 그와 같은) :

#include <ArduinoUnitTests.h>
#include "../do-something.h"

unittest(library_does_something)
{
  assertEqual(4, doSomething());
}

unittest_main()  // this is a macro for main().  just go with it.

그게 다야. 만약 그렇다면 assertEqual 구문 및 테스트 구조는 친숙해 보입니다. Matthew Murdoch의 Arduinounit 도서관그가 언급 한 그의 대답.

보다 참조 .md 단위 테스트 I/O 핀, 시계, 직렬 포트 등에 대한 자세한 내용은

이 단위 테스트는 루비 보석에 포함 된 스크립트를 사용하여 컴파일 및 실행됩니다. 이를 설정하는 방법의 예는 readme.md 또는이 예 중 하나에서 복사하기 만하면됩니다.

부르는 프로젝트가 있습니다 Ncore, Arduino의 기본 코어를 제공합니다. Arduino 코드에 대한 테스트를 작성할 수 있습니다.

프로젝트 설명에서

기본 코어를 사용하면 일반적으로 수정없이 PC에서 Arduino 스케치를 컴파일하고 실행할 수 있습니다. 표준 Arduino 기능의 기본 버전과 일반적으로 하드웨어 자체에서 나오는 스케치에 입력을 제공하는 명령 줄간에 제공됩니다.

또한 "무엇을 사용해야하나요"섹션

테스트를 구축하려면 cxxtest가 필요합니다. http://cxxtest.tigris.org. Ncore는 CXXTEST 3.10.1로 테스트되었습니다.

MCU (데스크탑) 이외의 외부 테스트 코드를 유닛 테스트하려면 libcheck을 확인하십시오.https://libcheck.github.io/check/

나는 그것을 사용하여 내 임베디드 코드를 몇 번 테스트했습니다. 매우 강력한 프레임 워크입니다.

당신이 사용할 수있는 에 둘레 - 다이어그램에서 마이크로 컨트롤러를 드래그 앤 드롭하고 Eclipse에서 코드를 실행할 수 있습니다. 웹 사이트의 문서는 설정 방법을 알려줍니다.

Arduino 라이브러리와 함께 Proteus VSM을 사용하여 코드를 디버깅하거나 테스트하십시오.

코드를 탑승하기 전에 모범 사례이지만 시뮬레이션이 보드에서 실행될 때 실시간으로 실행되지 않기 때문에 타이밍을 확인하십시오.

노력하다 Autodesk 회로 시뮬레이터. 다른 하드웨어 구성 요소로 Arduino 코드 및 회로를 테스트 할 수 있습니다.

기본 Arduino에서는 C 및 C ++로 작성되었으며 Arduino의 라이브러리조차도 C 및 C ++로 작성됩니다. 따라서 간단한 용어로 코드를 C 및 C ++로 처리하고 장치 테스트를 시도하십시오. 여기서 "핸들"이라는 단어로 Serial.println과 같은 모든 기본 구문을 Sysout으로 변경하고, PinMode, VARAIBLES로, while roop to while while while while while the () 루프를 키스탁 또는 일부 반복 후에 변경하는 것을 의미합니다.

나는 이것이 긴 과정이 거의없고 간단하지 않다는 것을 알고 있습니다. 내 개인적인 경험에서, 일단 당신이 그것과 관련이 있으면, 이것은 더 신뢰할 수 있습니다.

-nandha_frost

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