質問

Arduino コードを単体テストできるようにしたいと考えています。理想的には、コードを Arduino にアップロードせずにテストを実行できるようになります。これに役立つツールやライブラリは何ですか?

があります Arduinoエミュレータ開発中 これは便利かもしれませんが、まだ使用する準備ができていないようです。

AVRスタジオ Atmel の には便利なチップ シミュレーターが含まれていますが、Arduino 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で唯一のハードウェアのシリアルポートです。また考えることSoftwareSerial図書館が、知っておきたいという混乱が他の機能を必要とする正確なタイミングのように発生その他の信号も同時に行います。この問題に起こったことだった。

再いた場合は、テストスケッチをエミュレータをご要とするルーチンが走り味までにアップロードした実際のArduino、その後のレッスンで学ぶには、エミュレータに不備があとを知ることが明らかに なし の品質について ご自身の ます。

の場合は追試験の装置またはエミュレーター、 すべ いかがですか?

しょ利用のコンピュータ上で動作しArduinoプロジェクト.コンピュータは桁以上のマイクロコントローラです。記試験を コンピュータ.

この挙動は、Arduino図書館とマイクロコントローラは と仮定は正しいまたは少なくとも 一貫して 誤った.

る場合試験は出力に反してご期待しまれて欠陥コードする実験を行った。場合は試験出力の試合にご期待が、プログラムが動作しないおそれが正しくアップロードが完了しましたので、Arduinoからも分かる試験に基づいた誤った前提条件とすることによって欠陥のあるテストです。いずれの場合も、まれて見え、次のコードを変更します。の品質のフィードバックから"何か 破壊した"に "この 特定のコード 破壊した".

どうや走行試験をPC

最初にやるべきことはい 特定の試験の目標.考えよう 独自のコード お試したいと思い、その後確認の構築のためにプログラムなどできる 離散部品 試験をします。

合する部品のテストコールのArduino機能を準備する必要がありまモックアップ置換を試験プログラム。こはるかにインパクトは小さいものの作品をデザイン性にも優れたです。自モックアップいうものが提供する予測入力および出力用試験までを実施。

任意のコードにしようとする試験のニーズが存在するソースファイル以外できます。pdeす。心配しないで、スケッチがコンパイルであるもののソースコードの外です。きんでも、ちょっとりプログラムの通常のエントリポイントに定義する必要があり、スケッチファイルです。

については、シンプルにわかりやすく書く、実際の試験としてコンパイルでお好みのC++コンパイラのイン!ここでは例と実世界の一例です。

実際の作業例

私のペットの見つかったプロジェクトのロー こちらの は簡単なる試験走行をコントロールします。この答えを提出いんかん(*_*)正-一Arduino図書館機能の試験に書いた試験方を模擬します。これに対抗するものではなくってしまう前については試験、他の人のコードでの書きのモックアップ.たいと思ったのもある私のモックアップが正しい。

源mock_arduino.cppを含むコードの重複を一部支援機能の提供するArduino図書館

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

私のモックアップを読み出力が自分のコード書き込みバイナリデータのハードウェアのシリアル装置です。

fake_serial.h

#include <iostream>

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

extern FakeSerial Serial;

fake_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 あまりテストケース入ります。さん、制作中のもの支店以外のマスターでチェック方のための余分な試験です。

私は自分で軽量試験ルーチンがより強固なユニットテストの枠組みなどが含まれているもございます。

私は大きな成功は単体テストマPICコードを抽象化のハードウェアにアクセス、嘲笑うん。

例えば、抽象PORTAと

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

その後SetPortAです(*_*)正、追加費のコードは、日替バージョン。

一度のハードウェア抽象化していらっくべる一般的にコードからの試験装置の日替品です。

更新:

を使用したいの#include縫い目の単位コードは、#を含むユニットコードのC++ファイルの試験装置、Cファイルのコードです。

例として、また多重四7セグメントディスプレイ、一つのポートには、セグメント第二の選択に表示されます。表示コードの界面の表示によ SetSegmentData(char)SetDisplay(char).できる模擬これらの私のC++試験機ることを確認したデータを取得します。の目標を使ってい #define その直割りせずにオーバーヘッドの呼び出し

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

emulino には完全に仕事をするだろうと思われます。

  

EmulinoはグレッグHewgillによってArduinoのプラットフォーム用のエミュレータです。 (ソースの)

GitHubのリポジトリ

シマヴル AVRです シミュレーター avr-gcc を使用します。

すでにいくつかの ATTiny および ATMega マイクロコントローラーをサポートしており、作者によれば、さらにいくつかのマイクロコントローラーを追加するのは簡単です。

例には、Arduino エミュレータである simduino があります。Arduino ブートローダーの実行をサポートしており、avrdude を使用してプログラムできます。 ソカト (修正された ネットキャット).

あなたは私のプロジェクトとPythonでユニットテストをすることができ、 PySimAVR に。シミュレーションのための Arscons の建物に使用され、のsimavrの

例:

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のコードをテストすることができ、任意のプラットフォームを認識していないです。

ただし、ハードウェアをモデル化するために使用することができます Fritzing のプラットフォームは、そこにあります以降、輸出のPCB図やものでます。

チェックする価値ます。

私たちは、大規模な科学実験でのデータ取得のためのArduinoボードを使用しています。その後、我々は、異なる実装でいくつかのArduinoボードをサポートする必要があります。私は、動的にユニットテスト中のArduinoの六角イメージをロードするためにPythonのユーティリティを書きました。下記のリンクで見つけたコードは設定ファイル経由でWindowsとMac OS Xをサポートしています。ビルド(再生)ボタンを押す前に、あなたの六角画像はArduinoのIDEで配置されている場所を見つけるには、Shiftキーを押してください。あなたのAVRDUDEは(コマンドラインユーティリティをアップロード)の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 Package Index: http://pypi.python.org/pypi/arduino_testsuite

単体テスト(ユニットテストして、"Arduinoブ": http://code.google.com/p/arduinounit

は、以下の手順に従って行われたそれぞれのユニット試験:

  • の設定ファイルを試験走行
  • スクリプトを統と遊びのArduinoスケッチを含むユニットテストのコードです。
  • 単体テスト(ユニットテストは、Arduinoます。
  • その結果に印刷のシリアルポートにより解析を行Pythonスクリプト
  • スクリプトに始まり、次の試験を繰り返しながら、上記の手順を全ての検査が要求された場合には、当該設定ファイルを指定します。
  • のスクリプトの版画の概要を示す概略の失敗/渡試験は完全にtestsuite.
あなたがテストし、大きなあなたが良いツールを持っているとあなたが最も精通しているとの任意のプラットフォーム上で「休む」ことをデバッグできるように、

個別または離れて休息から抽象化ハードウェア固有のコードをしてくださいます。

基本的には、できるだけ多くの知らツー作業ビルディングブロックからの最終的なコードの多くを構築してみてください。残りのハードウェア固有の作業は、はるかに簡単かつ迅速になります。既存のエミュレータを使用して、および/または、独自のデバイスをエミュレートすることによって、それを終了してもよいです。そして、もちろん、あなたが何らかの形で本物をテストする必要があります。状況に応じて、それはしてもしなくてもよい(すなわち、誰か何がボタンを押して、様々な指標と出力を観察し、解釈するか、どのような他の入力を?提供します?)非常によく自動化することがあります。

ジェームズW. Grenningは素晴らしい本を書き、これはユニットテスト組み込みCコードの<のhref = "http://pragprog.com/titles/jgade/test-driven-development-for-embedded-についてです組み込みCのためのC」のrel = "nofollowを">テスト駆動開発する

私が使用しています Searduino のArduinoのコードを書くとき。 Searduinoお気に入りのエディタを使用してC / C ++でハックすることが容易になりArduinoのシミュレータや開発環境(メイクファイル、Cコード...)です。あなたはArduinoのスケッチをインポートし、シミュレータでそれらを実行することができます。

Searduino 0.8のスクリーンショット:ます。http:// searduino。 files.wordpress.com/2014/01/jearduino-0-8.pngする

Searduino 0.9がリリースされる予定とビデオは、すぐにテストが一日か二日に....行われます。

続きとして記録されます

シミュレータでのテストは、実際のテストと見なされるべきではない、それは確かに愚かな/論理的なミス見つけることに私をたくさん助けた(pinMode(xx, OUTPUT)を行うことを忘れ、など。)。

ところで:私はSearduinoを開発する人々の一人です。

私たちのた arduino_ci この目的です。この限られた試験Arduinoライブラリ(な単体のスケッチ)をもとに、ユニットテスト実行される現場で、またはCIシステム(トラCIやAppveyor).

考えるシンプルなライブラリはArduinoライブラリ-ディレクトリと呼ばれる DoSomething, は、 do-something.cpp:

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

int doSomething(void) {
  return 4;
};

You単体テストで次のように試験のファイルと呼ばれ 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 構文および試験構造が見え、これを採用したもの マシュー-マードックのArduinoUnit図書館 それ 彼の答え.

参考にする。md 情報単位試験のI/Oピンのクロック、シリアルポートなど。

これらのユニットテストの集計を使って実行するスクリプト中に含まれるrubyの逸品です。●る方法について設定するには、 README.md だからコピーされた例

Arduinoのためのネイティブコアを提供 ncore に呼ばれるプロジェクトが、あります。そして、あなたはArduinoのコードのテストを記述することができます。

プロジェクトの説明から

  

ネイティブコアを使用すると、上のArduinoのスケッチをコンパイルして実行することができます   PC、一般的に無修正で。これは、ネイティブのバージョンを提供します   与えるために、標準的なArduinoの機能、およびコマンドラインinterepreter   通常、ハードウェアから来るあなたのスケッチへの入力   自らます。

また、私が使用する必要が何をすべきか」にそれは」セクション

  あなたがテストを構築したい場合は、

、あなたはからcxxtestが必要です    http://cxxtest.tigris.org に。 NCOREはcxxtest 3.10.1でテストされています。

あなたはMCU(デスクトップ上)外ユニットテストコードにしたい場合は、libcheckをチェックアウト: https://libcheck.github.io/check/する

私は自分自身の埋め込みコードを数回テストするためにそれを使用しました。それはかなり堅牢なフレームワークです。

ドラッグアンドドロップマイクロコントローラを図にし、Eclipseでコードを実行することができます -

あなたは emulare に使用することができます。ウェブサイト上のドキュメントには、それを設定する方法を説明します。

あなたのコードをデバッグしたり、それをテストするためのArduinoライブラリとプロテウスVSMを使用します。

これは、オンボードのあなたのコードを取得する前にベストプラクティスですが、彼らはボード上で動作するようシミュレーションをリアルタイムに実行されないので、タイミングで確認してください。

のオートデスク回路シミュレータを試してみてください。それは多くの他のハードウェアコンポーネントとArduinoのコードと回路をテストすることができます。

基本的なArduinoのでは、CおよびC ++で書かれている、Arduinoののも、ライブラリはCやC ++で書かれています。だから、簡単な言葉で、単にCとC ++のようにコードを処理し、ユニットテストをやってみてください。ここでは、言葉で私はあなたがvaraibles、keystockまたはいくつかの反復後のいずれか壊しながら、()ループに無効ループに、SYSOUTにpinmodeをserial.printlnのようなすべての基本的な構文を変更することを意味する「ハンドル」。

私はあなたがそれを行うために得れば、これはより信頼できるものとなり、これは少し長いプロセスである知っているではないので、まっすぐに私の個人的な経験forward.Onます。

-Nandha_Frost

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top