C++でもpytestみたいに簡単に単体テストをしたいから単体テストフレームワークを入れようと思ったんです。
GoogleTestかCPPUTestかなと思ったが、CPPUTestにした。
参考にしたやつ:
- 本家
- https://qiita.com/snow_yamaie/items/7bb40f4851e7c74
- WSLでCppUTestを試してみた - Qiita
- CppUTestでCコードのUnitTestを行う - Qiita
- C++初心者のみんな、単体テストとCIを組めるようになって君もライブラリ製作者の仲間入りしよう! - Qiita
一番下のやつは、テストしないと後々大変なことになるってのは急がば回れ的な奴で、製造業ではよく知られたことだが、何故かIT業界だとカウボーイコーディングしがち。
環境
- WSL2
- Windows 10 insiderの何か
インストール
みんな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
$ ./hogehoge.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
$ ./hogehoge.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)
こんな感じになる。