Cの単体テストを自動的に実行する

科学計算にはCを使用します。 そして、この場合、あなたは一生懸命に考える必要があります、あなたは本当にCを本当に必要としますか?

C言語は、計算でパフォーマンスが非常に重要であるか、ハードウェアへのアクセスが重要である場合にのみ必要です。 他のすべての場合では、 RubyPython (科学計算のほぼ標準言語、数学から生物学までのさまざまな種類の科学パッケージの多く)などの高レベル言語、またはSage (Pythonアドオンの機能を備えたアドオン)などの科学パッケージを強くお勧めしますSageプログラム内で、Sageの機能が十分でない場合に備えて、シンボリック計算や他の多くの機能の使用、および他の数学パッケージを接続する機能を備えています。ちなみに、 彼らはハブでSageについて書いています。

Pythonの場合、パフォーマンスが重要であり、Cコードを完璧になめる準備ができていない場合、ほとんどのPythonコードをCコードにコンパイルし、非常に高いパフォーマンスインジケーターを達成するCython (その著者はSageの著者でもあります)があります。

したがって、この段階でもう一度お勧めします。科学的な計算やその他の計算にCを使用する前に考えてください。 そうでなければ、行こう!

したがって、まだCを使用することにしました。この場合、次の作業テスト環境を編成する必要があります。


なぜなら、それを実装するコードが適切にテストされていない場合、それはどのような科学的計算だろうか? まあ、それはテストで開発テストがはるかに高速であるという事実に加えてです。 しかし、実際に速度を上げるには、テストを自動的に実行する必要があります。

ユニットテスト用のフレームワークの選択に関するトピックには、 Stackoverflowの強力なブランチ 、ハブの投稿 、Wikipediaページのユニットテストフレームワークの比較 、CおよびC ++でコードをテストするためのrspecがあります (すぐには始めませんでした)。

このすべての中で、 Google Testing Frameworkは私にとって最も楽しいようでした(ハブについても書いています)。

唯一のことは、彼と仕事をするとき、C言語のテストにあまり慣れていない人として、多くの問題があったことです(たとえば、Ubuntuで人間のテストをコンパイルして実行する方法?!)。 この質問は、「プロジェクトフォルダーにgtestを入れてREADMEの指示に従う」ことはもちろん、人間にはほど遠いことや、古いUbuntu(11.10より古い)の指示には適していません。オネリックオセロット。

すべての嘆きの結果は、次の簡単なテキストsudo apt-get install libgtest-devsudo apt-get install libgtest-dev (またはyaourt -S gtest gtest)になります。 次に、ファイルmy_app_test.cppに次のように記述する必要があります。
 #include "gtest/gtest.h" int add(int value1, int value2) { return (value1 + value2); } TEST (AddTest, PositiveNos) { EXPECT_EQ (16, add(8, 8)); } 

ここで、AddTestはテストグループの名前で、PositiveNosはテストの名前です。 EXPECT_EQは、名前からほぼ明らかなように、2つの式の値が等しいかどうかをチェックします。 アナログassert 16 == 8+8 。 ただし、ASSERT_TRUEも兵器庫にあります。

すべて、テストの準備ができました。 もちろん、実際には#include "my_app.h"を実行する必要がありますが、この例では、私たちが持っているものを使用します。

テストを実行するには、次のg++ my_app_test.cpp -lgtest_main -lgtest -pthread && ./a.outます。

ロシア語の詳細については、 公式教科書をご覧ください。

テストの失敗を説明します(赤)



そして成功(緑)



テストが確立されました。コードを変更した後、自動テスト実行を設定する必要があります。 そうしないと、単体テストによるこのアプローチのニュースは機能しません。

これを行うには、 ウォッチャーツール(Ruby環境で人気)を使用します。 すべてを美しく、素敵な通知を表示するには、インストール済みのlibnotifyライブラリが必要です(すべてを美しくするには、プロジェクトフォルダーに .watchr_images / failed.pngファイルと.watchr_images / Passed.pngファイルを配置する必要があります )。

ruby(watchrに必要)とlibnotify: sudo apt-get install ruby libnotify4から、watchr: sudo gem install watchr

ここからウォッチャーファイル取得します。 スクリプトのテキストを提供します。
 ENV["WATCHR"] = "1" system 'clear' def run(cmd) puts(cmd) system(cmd) end def growl(result) message = result ? "OK" : "FAILED" growlnotify = `which notify-send`.chomp title = "Watchr Test Results" image = (result) ? ".watchr_images/passed.png" : ".watchr_images/failed.png" options = %("#{title}" "#{message}" -i #{File.expand_path(image)}) system %(#{growlnotify} #{options} &) end watch( '(.+)(\.c|_test\.cpp|\.h)$' ) do |md| result = run("g++ #{md[1]}_test.cpp #{md[1]}.c -lgtest_main -lgtest -pthread -o #{md[1]}_test && ./#{md[1]}_test") growl result puts ("\n\n") end 


スクリプトは、単純なwatchr watchr.rbます。

Source: https://habr.com/ru/post/J133315/


All Articles