2013-08-03 8 views
9

Ich bin neu in Erlang. Es hat 2 Test-Frameworks: EUnit und Common Test. Ich bin verwirrt, wenn man einen über den anderen benutzt. Kann mir jemand erklären, welche Vorteile EUnit gegenüber Common Test hat und umgekehrt? Seem Common Test kann alles, was EUnit tun kann und vieles mehr, nicht sicher, was ich EUnit verwenden soll. Vielen Dank!EUnit vs Common Test

Antwort

5

Eunit ist wirklich einfach und passt sehr gut für Modultest oder Bibliothekentest auf White-Box-Ebene. Es ist in Betonstahl integriert.

Gemeinsame Test ist mehr für Black-Box-Tests und Anwendung und System der Anwendung Test ausgerichtet. Es kommt mit Testabdeckung sehr leicht.

bearbeiten (nach Andy Kommentar):

Es ist richtig, dass Sie gemeinsamen Test für eine einheitlichen weißen Box-Test verwenden können, sowie es richtig ist, dass Sie eunit bis zu einem gewissen Anwendungstest mit Geräten nutzen können.

Allerdings ist eUnit sehr praktisch für einen einfachen einheitlichen Test: Sie schreiben eine Funktion myFun, fügen Sie eine Testfunktion myFun_test oder einen Testgenerator myFun_test_ (nützlich, um viele Muster zu testen, auch wenn einige Tests in der Mitte fehlschlägt) in Ihrem Testmodul und das ist es. Sie können es beliebig oft ausführen (keine Testhistorie).

Der allgemeine Test fordert Sie auf, jeden Testfall in der all-Funktion oder in einer Gruppe aufzulisten. Soweit ich weiß, hat es keinen Testgenerator, daher ist es weniger einfach, alle Testmuster jeder Funktion zu durchlaufen. Deshalb denke ich, dass es weniger an einheitliche White-Box-Tests angepasst ist. Auf der anderen Seite sind die init_per_testcase, init_per_group ... viel flexibler als eunit Fixtures, um die Tests zu organisieren, wenn sie einen bestimmten Anwendungskontext benötigen. Common Test führt auch einen Verlauf aller Tests im Log-Verzeichnis. Es ist nett, aber ich schlage vor, die Anzahl der Runs zu begrenzen, um sie nützlich zu halten.

EDIT:

Um das Problem der nicht exportierten Funktionen zu vermeiden, sowohl für eunit und gemeinsamen Test, es möglich ist, definiert zu verwenden. zum Beispiel in rebar.config (weil ich separate Dateien für eunit Tests verwenden):

{eunit_compile_opts, [{d,'EUNIT_TEST',true}]}. 
{erl_opts, [debug_info, warn_export_all]}. 

und in einem Modul, wenn es notwendig ist:

%% export all functions when used in eunit context 
-ifdef(EUNIT_TEST). 
-compile(export_all). 
-endif. 

Sie überprüfen können, dass sie ändern nur die kompilierte Code für eunit

D:\git\helper>rebar clean eunit compile 
==> helper (clean) 
==> helper (eunit) 
Compiled test/help_list_tests.erl 
Compiled test/help_ets_tests.erl 
Compiled test/help_num_tests.erl 
Compiled src/help_ets.erl 
Compiled src/help_list.erl 
Compiled src/helper.erl 
src/help_num.erl:6: Warning: export_all flag enabled - all functions will be exported 
Compiled src/help_num.erl 
Compiled src/help_code.erl 
    All 31 tests passed. 
Cover analysis: d:/git/helper/.eunit/index.html 
==> helper (compile) 
Compiled src/help_ets.erl 
Compiled src/help_list.erl 
Compiled src/helper.erl 
Compiled src/help_num.erl 
Compiled src/help_code.erl 
+0

danke Pascal. Ich habe mit einigen Erlang-Ingenieuren gesprochen, der einzige Grund, warum ich habe, ist, dass common_test nicht exportierte Funktionen nicht testen kann. – user342673

+0

Dies ist nicht wahr, Sie integrieren Tests in das Quellmodul, so dass Sie testen können, was Sie wollen. –

+0

Ich habe meine Antwort nach Andy Kommentar bearbeitet. Mir ist dieser Weg nicht bekannt, um einen gemeinsamen Test zu verwenden, ich schreibe die Testfälle in test_SUITE.erl Module – Pascal

10

Learn you some erlang (eines der besten Online-Ressourcen für erlang, neben dem offiziellen doc) erklärt, beide Methoden sehr gut:

Wie Pascal darauf hingewiesen, EUnit am besten in White-Box-Tests verwendet, eher wie interne Funktion-by-Funktion Unit-Tests, Lichtintegrationstests.

Gemeinsame Test macht das schwerere Heben: Integration & Systemtest, Black-Box Art von Sachen. Es ist natürlich auch komplexer und viel mächtiger.

Während Sie gerade dabei sind, können Sie Dialyzer versuchen, ein weiteres integriertes Test-Tool in Erlang/OTP, das hervorragend in der Lokalisierung von totem oder unerreichbarem Code, logischen Fehlern & (es ist ein statischer Typ Analysator). Erneut, lernen Sie etwas erlang bietet eine nette Einführung dazu: Dialyzer.

Oh, übrigens, wenn Sie die EUnit-Tests in separate Dateien (was durchaus möglich ist) setzen, können Sie nicht-exportierte Funktionen (das ist zu erwarten) nicht testen. Was auch erwartet wird, ist, dass Common Test nichtexportierte Funktionen nicht testet: Sonst wäre es kein Black-Box-Test-Tool (vielleicht ein Betrüger).

+1

Sie können alle Funktionen im Testkontext exportieren, jedoch ist es noch wichtiger, die Unterscheidung in Blackbox Tests zu treffen (keine export_all erlaubt) und White Box Tests (mach was du willst). siehe Bearbeiten. – Pascal

+0

Ich bestätige, dass die Seite Lernen Sie etwas Erlang ist eine der besten für Erlang. – Pascal

0

Von http://www.erlang.org/doc/apps/common_test/basics_chapter.html:

gemeinsamer Test ist auch ein sehr nützliches Werkzeug für White-Box-Tests Erlang-Code (zB Modultest), da die Testprogramme aufruf können direkt Erlang Funktionen exportieren und es gibt sehr wenig Aufwand erforderlich für die Umsetzung grundlegende Testsuites und Ausführen einfacher Tests. Für Black-Box-Tests können beispielsweise Erlang-Software, Erlang RPC sowie Standard-O & M-Schnittstellen verwendet werden.