CPPUTestを使おうと思ったんだ

C++でもpytestみたいに簡単に単体テストをしたいから単体テストフレームワークを入れようと思ったんです。
GoogleTestかCPPUTestかなと思ったが、CPPUTestにした。

参考にしたやつ:

  • 本家

cpputest.github.io

一番下のやつは、テストしないと後々大変なことになるってのは急がば回れ的な奴で、製造業ではよく知られたことだが、何故かIT業界だとカウボーイコーディングしがち。

環境

インストール

みんなgit cloneしたやってたけど、aptでいいと思う。

$ sudo apt install cpputest

パスを通さないといけないが、どこに入ってるかよくわからないので、

$ dpkg -L cpputest

僕の場合はどうやら`/usr/share/cpputest`に入ってるっぽかった。

これをPATHを通すことにする。

なんかうまく動かなかったので、git cloneしてmakeした。
aptでいれたのをとりあえず消す。

$ apt purge cpputest

gitからとってきてコンパイルする。インストール先は`/usr/share`にした。なんとなく。

$ git clone git://github.com/cpputest/cpputest.git
$ sudo mv cpputest/ /usr/share
$ cd /usr/share/cpputest
$ cd cpputest_build/
$ cmake ..
$ make
$ sudo make install
$ cd ../scripts
$ chmod +x NewProject.sh

ヘッダとライブラリがインストールされた場所が`make install`のときに出てくるから、それをみてPATHを通す。
今回の場合は、

  • ヘッダ: /usr/local/include
  • ライブラリ: /usr/local/lib

に入っていたので、

export CPPUTEST_HOME=/usr/local
export PATH=$PATH:${CPPUTEST_HOME}/lib

を足してあげる。そして、

$ source ~/.bashrc

をして設定を反映させる。

試しに使ってみる

テストコードも本体もごちゃまぜのコードを書いてみる。
`hoge.cpp`というテスト用のファイルを仮で作った。

#include


class TestClass {
private:
int i, j, k;
public:
int MagicalBanana(int i) {
return 2 * i;
}
};




TEST_GROUP(TestGroup1){};
TEST(TestGroup1, MELON_PEACH){
STRCMP_EQUAL("peach", "melon");


}

int main(int argc, char *argv[]) {
return CommandLineTestRunner::RunAllTests(argc, argv);
}

Makefileを最初から書いてもいいけど、まずは普通にg++でコンパイルして実行してみる。

$ g++ hoge.o -o hoge -L/usr/local/lib -lCppUTest -lCppUTestExt
$ ./hoge

hoge.cpp:18: error: Failure in TEST(TestGroup1, MELON_PEACH)
expected
but was
difference starts at position 0 at: < melon >
^

.
Errors (1 failures, 1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 0 ms)

"melon"は"peach"ではないのでエラーが出る。

今度はMakefileを作ってみる。

PROGRAM = hoge
OBJS = hoge.o
CXX = g++
CPPFLAGS = -Wall -O3 -fPIC
CPPFLAGS += -I$(CPPUTEST_HOME)/include
LD_LIBRARIES = -L$(CPPUTEST_HOME)/lib -lCppUTest -lCppUTestExt


$(PROGRAM):$(OBJS)
$(CXX) $(OBJS) -o $(PROGRAM) $(LD_LIBRARIES) $(CPPFLAGS)

clean:
rm $(OBJS)


.SUFFIXES: .o .cpp .cu

.cu.o:
$(NVCC) -c $<
.cpp.o:
$(CXX) $(CPPFLAGS) -c $

これをコンパイルして実行すると、

$ make
g++ -Wall -O3 -fPIC -I/usr/local/include -c hoge.cpp
g++ hoge.o -o hoge -L/usr/local/lib -lCppUTest -lCppUTestExt -Wall -O3 -fPIC -I/usr/local/include
$ ./hoge

hoge.cpp:18: error: Failure in TEST(TestGroup1, MELON_PEACH)
expected
but was
difference starts at position 0 at: < melon >
^

.
Errors (1 failures, 1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 0 ms)

こんな感じになる。