【ソフトウェアテスト】xUnit と Spec系の比較
テスティングフレームワークについてググっていたら、どうやら2系統にわかれるっぽい。
xUnit
SUnit(Smalltalk) に始まり、JUnit(Java)、GoogleTest(C++)、HUnit(Haskell), ScalaTest(Scala), ExUnt(Elixir) など。
自分は今までこちらしか使ったことがなかった。
Spec系
RSpec(Ruby), JGiven(Java), Igloo(C++) , HSpec(Haskell), Spec2(Scala) ,ESpec(Elixir)など。
テストケースの記述にフォーマットが決まっている。given/when/then
どちらを選ぶ?
メジャーな言語は両方の系統を持っていることも多い。Spec系のほうが後から作られただけあって、下記のメリットがありそう。
- BDDのツールなので、ユーザ視点で表現する。プログラマ以外の人と仕様をすり合わせしやすい。
- 決まり切ったコード(Boilerplate code)を減らせる
とはいえ。システムテスト・受入テストについていえば1のメリットはありそうだが、単体テスト・結合テストは開発者が行うテストなので、あまり関係ないかも。
2についていえば、概ね一般論として xUnit より有利、と言えるかもしれないが、実際には各ツールの出来に依存するのではないか?
なので、出来れば両方使ってみて使いやすいほうを使う、というのが正解な気がする。
【ToDo】ソフトウェアテストの例題
【関数型言語】Haskell のテストツール
stack を使ってプロジェクトを作成すると、それだけで test ディレクトリが作成され、stack test するとテストが実行できる。いったい何をどうテストしているのか?
stack new hello
stack build
stack test
また、haskell で使えるテストツールとして
- HSpec
- HUnit
- QuickCheck
HSpec は BDD なツール、HUnit はユニットテスト用、QuickCheck はテストデータ・テストケースまで自動生成してくれるらしい(@_@)
これから使い方を調べて使ってみる予定。
インストールの仕方だが、stack の設定ファイル1行追加するだけでよいらしい。
記事通りに、hello.cabel の buld-depends に hspec の1行を追加し、
build-depends:
base >=4.7 && <5
, hspec
stack test を実行したところ、いろいろ必要なものを自動的にダウンロードし、自動的にテストの実行まで無事に完了した。ダウンロード中のメッセージから、HUnit と QuickCheck もちゃんとダウンロードされていることを確認できた。
とりあえず、下記の記事を真似て、動かしてみる。
【関数型言語】処理速度とメモリ使用量
処理速度
超大作。途中に各言語のベンチマークがある。
-
効率の面において、関数型言語はC++にはまったく歯が立ちません。C/C++は最速です
-
C++には叶いませんが、JavaやC#、JavaScriptなどのメジャーな言語と同程度か、それより少し遅いくらいのパフォーマンスが出ます
-
Ruby/Python/PHPなどのスクリプト言語をはるかに上回ります
メモリ使用量
個人的には、「データが全て不変(immutable)って、無茶無茶メモリを食うんじゃ?!」と思ったので、実際のところどうなのか知りたかった。
だが。
関数型言語に関する記述・データが見つからない。
参考
「関数型言語でもJavaやpython などと同様に、データが不要になったらガベージコレクションされる」というのはわかった。ただ、前述のように、「変数を変更するたびに新しい変数を作る」ことが、ほかの言語と比較してどのくらいメモリを使うのか、しりたいところだ。