Google TestやBanditなど、C ++コードの単体テスト用のライブラリは既にありますが、 彼らは私によって書かれていません ここで、私の意見では、同じJSと比較して何らかの形で複雑になっています。 そこで、たとえばnpm i mocha assert --save-dev
を実行するだけで、テストの作成を開始できますが、ここではペンを使用して実行する必要があり、 gtest
の場合はcmake
を使用してビルドgtest
もgtest
。 Banditは単純に接続しますが、結果を何らかのデータ形式にgtest
する方法を知りませんgtest
これをgtest
ことができますが、個別に収集する必要があります。 そして、私は「これもあれも」を選びたくありません。 私は自分の仕事に便利でシンプルなツールを作る必要がありました。 プロジェクトに簡単かつ迅速に接続できるいくつかのファイルについて、依存関係のない、ヘッダーのみのシンプルなライブラリを取得したかったので、必要に応じて変更を加えると便利です。 しかし、最も重要なのは、 stdout
(またはgtest
ようなxml
)だけでなく、必要な他の形式でも、便利で機械可読なレポートを取得したかったということです。 さらにカットの下。
上記で書いたように、 ドックヘッダー専用ライブラリは、その接続が可能な限り単純であることを意味します。
#include <iostream> #include <dock/dock.hpp> using namespace dock; int main() { core().run(); return 0; }
たとえば、gccでビルドする場合、ライブラリフォルダーへのパスのみを転送し、C ++ 14言語標準を指定する必要があります。 私は新鮮な標準で新しいプロジェクトを書いており、古いものをサポートするための独自のライブラリを用意しているため、意図的にこれを行います。
テストの説明も非常に簡単になっています。
using namespace dock; Module(u8"Some module 1", [](DOCK_MODULE()) { Test(u8"Some test 1", []() { uint8_t value = 0x10; uint8_t expectedValue = 0x10; Assert::isEqual(value, expectedValue); }); Test(u8"Some test 2", []() { uint8_t value = 0x10; uint8_t expectedBorder = 0x20; Assert::isLess(value, expectedBorder); }); }); Module(u8"Some module 2", [](DOCK_MODULE()) { Test(u8"Some test 1", []() { Assert::isTrue(true); }); Test(u8"Some test 2", []() { Assert::isTrue(false); }); });
便宜上、テストはモジュールにグループ化されます。 それらは、テストが直接記述されているstd::function<void(Module*)>
オブジェクトを渡します。 テストの構文はほぼ同じで、パラメーターのない機能オブジェクトのみです。 これまでのところ、モジュールまたはテストの名前の一意性のチェックは、重要ではなかったため、行っていません。
Assert
「ライブラリ」には、メソッドisTrue
、 isEquals
、 isGreater
、 isLess
簡単なセットが含まれています。デフォルトでは、 ==
、 >
または<
演算子を使用してオブジェクトを比較できます。 演算子がない場合は、最後に比較関数をパラメーターに渡すことができます(たとえば、ラムダの形式で)。
static void isTrue(std::function<bool()> fcn); template<typename T> static void isEqual(const T a, const T b, std::function<bool(const T, const T)> compareFcn = defaultEqualsFunction<T>); template<typename T> static void isGreater(const T a, const T b, std::function<bool(const T, const T)> compareFcn = defaultGreaterFunction<T>); template<typename T> static void isLess(const T a, const T b, std::function<bool(const T, const T)> compareFcn = defaultLessFunction<T>);
そして今、私が必要としたのは、テスト結果を必要なデータ形式に簡単に変換することです。 まず、プロジェクトの統計情報を使用して、テストのダイナミクスなどを監視したいだけです。JSでこれを行うと便利です。 したがって、最初に必要な形式はJSONでした。 リポジトリには既に3つの既製のシリアライザーがあります。JSONで、プレーンテキストで、強調表示されたコンソールへの出力です。 シリアライザーの使用は非常に簡単です。
nlohmann::json outJson; JsonSerializer serializer(outJson, 4); core().run(); core().collect(serializer); std::cout << serializer << std::endl;
また、シリアライザーインターフェイス自体は次のとおりです。
class ResultSerializer { public: virtual ~ResultSerializer() = default; virtual void serialize(std::vector<Result>& results) = 0; virtual std::string toString() const = 0; friend std::ostream& operator<<(std::ostream& os, ResultSerializer& s); };
つまり 結果はどこにでも出力でき、 std::ostream
だけで代用できます。 シリアライザーのロジックは次のとおりです。
-
collect()
を介してcollect()
エンジンに渡し、結果ベクトルを使用してserialize()
メソッドを呼び出します。 -
<<
ステートメントは、std::ostream
文字列をstd::ostream
toString()
メソッドを呼び出しstd::ostream
。
2つのオプションを実行できますserialize()
呼び出すとき、すぐに目的の行を作成し、それを単に返すか、結果へのリンクを保存し、ostreamに出力するときに出力を直接生成します。 いずれにせよ、移動の自由が残ります-エンジンはただstd::vector<dock::Result>
、あなたはそれで何をしなければなりませんか:)。
ライセンスは無料です(MIT)。私は気にせず、その使用を喜んで喜んでいるでしょう。 Modern C ++ライブラリのtermcolorとJSONが シリアライザーに使用されましたが、不要なシリアライザーと一緒に安全に削除できます。