2016-03-26 4 views
0

私たちは現在、自動化された継続的な統合環境でビルドプロセスをセットアップしており、ユニットテストを実行する際の根本的な問題に直面していますか?ユニットテストをいつ実行するのですか?

1つの方法は、すべてのビルドタスクで単体テストを実行することです。したがって、1つのユニットテストが失敗するとすぐに、ビルド全体が失敗します。これは、開発者がアプリケーションを実行することができないため、開発者がユニットテストを常に緑色に保つことが強制されるという利点があります。一方、開発プロセス中にテストを修正することで、常にあなたは気を散らします。これは、あなたが非常に小さな反復で作業するようになる可能性があります。それに加えて、毎回テストを待つ必要があるため、アプリケーションを実行する時間は常に増加します。

もう1つの方法は、新しいコミットのたびにCI-Serverにテストを実行させ、開発者に何か問題が起こったことを単に知らせることです。このように開発者はかなり時間がかかりますが、単体テストをいつでも気にすることはできますが、同じブランチの他の開発者も、ソフトウェアのすべての部分が期待どおりに動作していることを確認することができず、もし失敗したテストが彼らの仕事にも影響を及ぼすかもしれないならば、自分自身。

ベストプラクティスまたは推奨事項はありますか。テストを実行するのに適していますか?

BTW:もちろん、より大きな統合テストも実行します。これらのテストは、別々のCIプロセスで処理されます。

+0

上記の両方。 – kryger

答えて

0

ビルドプロセスには、ビルドとテストの2つのターゲットが必要です。他に何も指定しない場合、テストはデフォルトのターゲットにする必要があります。テストはプロジェクトがビルドされるまで実行できないため、ビルドターゲットはテストの依存関係です。だから(makeを使用すると仮定します):makeまたはmake testがビルドしてテストします。 make buildはプロジェクトをビルドするだけです。

IDEを使用している場合は、IDEの「外側」で別の方法でテストすることを検討できます。だから、おそらく3番目のターゲットideを追加して、ideがそれを構築できるようにしてください。その後、通常の依存関係としてビルドターゲットを持つことができ、最後のステップでバックグラウンドでテストを行うために新しいタスクを生成することができます。これはLinuxのようなものです:(xterm -e ./run-tests &)。

ideの外で開発している場合(私のように)、個別の端末でビルド&テストを実行してください。テストが始まるとすぐに、ビルドプロセスが完了したことを知っているので、テストがまだ実行中であっても、アプリケーションはすでに実行できます。

はこれを実証する(バックグラウンドでテストランを持つためのコンセプトの証明として)私はいくつかの些細なテストケース作成:

ボーデを。C:

#include <stdio.h> 

int main(int argc, char * argv[]) { 
     printf("Hallo %s", argc > 1 ? argv[1] : "Welt"); 
     return 0; 
} 

のMakefile:

test: build run-tests 

ide: build run-tests-background 

run-tests-background: 
     (xterm -e ./run-tests --wait &) 

run-tests: 
     ./run-tests 

build: bodo 

bodo: bodo.o 

bodo.o: bodo.c 

.PHONY: run-tests run-tests-background 

実行テスト:

#! /bin/sh 

retval=true 
if test "$(./bodo)" != "Hallo Welt" 
then 
     echo "Test failed []" 
     retval=false 
fi 
if test "$(./bodo Bodo)" != "Hallo Bodo" 
then 
     echo "Test failed [Bodo]" 
     retval=false 
fi 
if test "$(./bodo Fail)" != "Hallo Bodo" 
then 
     echo "Test failed [Fail]" 
     retval=false 
fi 
sleep 5 # Simulate some more tests 
if $retval 
then 
     echo "All tests suceeded ;)" 
else 
     echo "Some tests failed :(" 
fi 
if test "$1" == "--wait" 
then 
     read -p "Press ENTER to close" enter 
fi 
if $retval 
then 
     exit 0 
else 
     exit 2 
fi 

使用法:

は、プロジェクトをビルドしますが、テスト

make build 
を実行しないでください

プロジェクトをビルドし、

make 

現在の端末でテストを実行するかは、プロジェクトをビルドし、別の端末でテストを実行してください。作るビルドプロセスが完了し、テストを手動で実行するものではありません

make ide 

そして2ヘルパーを、始まった後に返されます: のみ現在の端末でテストを実行します(これは失敗し、プロジェクト場合

テストを別の端末で実行します(プロジェクトがまだ構築されていない場合は失敗します)。 makeは即座に戻ります

make run-tests-background 
0

短い答え:すべてのブランチでコミットごとにビルドサーバーですべての単体テストを実行します。あなたの単体テストを実行するのに本当に長い時間がかからないと仮定すると、実際にはこれに欠点はありません。すべてのユニットテストをすべてのビルドタスクでローカルに実行する場合、それは過度の作業です。開発者は、テストをいつ実行するか、テストを実行しないかを決定する規律を持つべきです。

何かが間違っている場合はできるだけ早く知りたいので、すぐに修正することができます。また、失敗した最初のテストだけでなく、失敗したすべてのテストを知りたいとします。複数の問題がある場合は、1つの問題だけを修正してから、コミットし、プッシュし、ビルドが再度実行されてから問題があるかどうかを確認する必要があります。

関連する問題