Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"getNumberOfFailedTests" Methodenaufruf #6

Open
lomoz opened this issue Jul 24, 2016 · 13 comments
Open

"getNumberOfFailedTests" Methodenaufruf #6

lomoz opened this issue Jul 24, 2016 · 13 comments

Comments

@lomoz
Copy link
Contributor

lomoz commented Jul 24, 2016

Hallo Filip,

kannst du mir vielleicht sagen wie ich die Methode "getNumberOfFailedTests" korrekt aufrufe?
Das testen ob etwas kompiliert funktioniert einwandfrei.

CompilationUnit cTest = new CompilationUnit(nameTestFile, inhaltTextAreaR, false); JavaStringCompiler scTest = CompilerFactory.getCompiler(cTest); scTest.compileAndRunTests(); CompilerResult crTest = scTest.getCompilerResult();

Aber wenn ich die Methode so aufrufe:
TestResult tr = scTest.getNumberOfFailedTests();

bekomme ich immer die Meldung:

cannot resolve Method

Wäre sehr nett wenn du mir da weiter helfen könntest :)

Grüße,
Lorcan

@krakowski
Copy link
Contributor

Hey,

Testergebnisse erhält man über die Methode getTestResult. Die von Dir erwähnte
Methode kann dort benutzt werden. In der verlinkten Dokumentation sind alle Methoden beschrieben.

Viele Grüße,
Filip

@lomoz
Copy link
Contributor Author

lomoz commented Jul 24, 2016

Vielen Dank.

jetzt weiß ich wie ich weiter vorgehen kann :)

@lomoz
Copy link
Contributor Author

lomoz commented Jul 25, 2016

Hallo Filip,

der Aufruf der Methode funktioniert zwar jetzt,
allerdings gibt die Methode auch den Wert 1 für fehlschlagende Tests zurück, selbst wenn es gar keine Tests gibt.
Das ist natürlich blöd wenn wir testen wollen ob die Anzahl der fehlschlagenden Tests = 1 ist, damit man zum eigentlichen Code weiter kommt.
Weißt du eventuell warum der Wert, obwohl keine Tests vorhanden, auf 1 gesetzt wird?
Die Anzahl an erfolgreichen Tests ist ohne Tests nämlich auf 0, wie es sein sollte.

Der Code dazu bis jetzt ist:

CompilationUnit cTest = new CompilationUnit(nameTestFile, textAreaR.getText(), true);
JavaStringCompiler scTest = CompilerFactory.getCompiler(cTest);
scTest.compileAndRunTests();
CompilerResult crTest = scTest.getCompilerResult();
tr = scTest.getTestResult();
int numberOfFailedTests = tr.getNumberOfFailedTests();
int numberOfSuccessfulTests = tr.getNumberOfSuccessfulTests();
System.out.println("Anzahl fehlgeschlagener Tests: " + numberOfFailedTests);
System.out.println("Anzahl erfolgreicher Tests: " + numberOfSuccessfulTests);

tr ist eine Instanzvariable, um die NullPointerException zu umgehen. Zumindest kommt die seitdem nicht mehr.

@krakowski
Copy link
Contributor

Hey,

wenn keine Tests vorhanden sind, wirft JUnit eine Exception mit dem Inhalt No runnable methods.
Offenbar wertet es dies als einen fehlgeschlagenen Test, daher die 1.

Ob ein Test fehlschlägt oder keine Tests vorhanden sind, könnt Ihr mit Hilfe der Methode
getTestFailures herausfinden, indem Ihr schaut ob TestFailure die Nachricht
No runnable methods beim Aufruf der Methode getMessage zurückgibt.

Die intern verwendete Methode getFailureCount ist für die 1 verantwortlich.

Viele Grüße,
Filip

@bendisposto
Copy link

getTestResult() liefert null, wenn es Compilerfehler gibt. Es muss daher immer geprüft werden, ob es solche Fehler gibt.
Man muss auch alle Inputs (d.h. Test + Code) gemeinsam beim getCompiler Aufruf mitgeben.

Also sowas wie:
CompilationUnit cCode = new CompilationUnit(nameCodeFile, textAreaL.getText(), false);
CompilationUnit cTest = new CompilationUnit(nameTestFile, textAreaR.getText(), true);
JavaStringCompiler scTest = CompilerFactory.getCompiler(cCode, cTest);
scTest.compileAndRunTests();

Wenn ich mir das anschauen soll brauche ich den BeispielInput für den es schiefläuft.

@padgm
Copy link
Contributor

padgm commented Jul 25, 2016

Hallo @bendisposto ,

sehr gerne. In der JSON Datei ist bspw. der Inhalt von FizzBuzzTest ein Input:
"Inhalt":"import static org.junit.Assert.*;\nimport org.junit.Test;\n\npublic class FizzBuzzTest {\n\n}"

und dazu natürlich der passende FizzBuzz Code:
"Inhalt":"public class FizzBuzz {\n\tpublic static void main (String[] args) {\n\n\t}\n}"

@bendisposto
Copy link

bendisposto commented Jul 25, 2016

Ja, aber euer Code kompiliert immer nur den testcase und nicht den dazugehörenden Code. Beide müssen als Compilation Units übergeben werden.

@padgm
Copy link
Contributor

padgm commented Jul 25, 2016

Das haben wir eben korrigiert. Das müsste jetzt richtig sein, sodass beides Code und Testcase übergeben wird.

EDIT:
Wir hatten es nur für die erste Methode "goToGreen" gemacht. Jetzt haben wir es noch für die nachfolgenden ergänzt.

@bendisposto
Copy link

bendisposto commented Jul 25, 2016

Ok, jetzt sehe ich das. Es gibt keine Tests, deswegen failed JUnit, markiert es aber als 1 fehlgeschlagener Test.

Jo, das könnte man als Bug in JUnit auffassen. Mein Tool kann da im Prinzip auch nichts dran tun. Ich würde das einfach ignorieren, es erlaubt dem Nutzer zwar ohne einen Test zu schreiben von RED nach GREEN zu wechseln, aber dort kommt man auf keinen Fall weiter und muss zurück nach RED

@padgm
Copy link
Contributor

padgm commented Jul 25, 2016

Okay das ist gut, vielen Dank, hatte uns nämlich etwas beschäftigt.
Da in der Anwendungsbeschreibung steht, dass man von RED zu GREEN kommt, wenn der Test nicht kompiliert, sofern eine nicht vorhandene Methode getestet wird, wird man auch weiter gelassen wenn ein einfacher Syntaxfehler (bspw. "}" oder ";" wird weggelassen) gemacht wird. Verhält es sich dann ebenfalls so, dass der Nutzer zwar weiter nach GREEN kommt, aber von dort nicht weiter und sowieso wieder zurück zu RED muss?

Wir haben noch eine Frage, wie aus der Collection, die wir ja von getTestFailures bekommen, am besten an ein Element kommen. Irgendwie schaffen wir das nicht wirklich elegant bis garnicht.

@bendisposto
Copy link

Ja, die einzigen "Syntaxfehler", die man im Test durch ändern des Codes reparieren kann sind fehlende Methoden. Ansonsten ist man gezwungen zurückzuwechseln und den Test zu reparieren.

@krakowski
Copy link
Contributor

Hey,

entweder packt man die Collection in eine ArrayList oder ähnliches oder arbeitet
mit einem Stream auf ihr. ArrayLists akzeptieren eine Collection im Konstruktor.

Viele Grüße,
Filip

@bendisposto
Copy link

Collection failures = ... // retrieve the Collection of failures

for( TestFailure failure : failures) {
// do something with a single failure
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants