Diskuze: Testovaní JUnit
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Petr Štechmüller:28.2.2017 18:46
Ahoj, nechcí být nějak extra kritický, ale máš to téměř celé špatně. Bylo by dobré si nejdříve o JUnit testech něco přečíst. Dobrá rada: nikdy v testech nepoužívej vlastní cykly, podmínky, try/catch bloky. Prostě nic, co by mohlo ovlivňovat chování testu. Testy mají být krátké, ideálně na pár řádek max 5 (jasně, může být i víc, ale spíše méně). Nepoužívej starou JUnit knihovnu, pokud k tomu nemáš nějaký důvod. Pokud potřebuješ dodávat do testů hromadu stejných parametrů, je dobré to řešit parametrizovanými testy. Jeden takový jsem Ti napsal na tu první metodu. Kód je tady. Možná je to dlouhý kód, ale přesně testuje jednu věc. Takto můžeš převést všechny tvoje testovací metody.
+20 Zkušeností
+2,50 Kč
Qestin:28.2.2017 19:19
Aha, děkuji. To testování jsme dostali od učitele, aby jsme si mohli vyzkoušet jak to funguje, ale právě vůbec to nefunguje, takže nechápu proč nám to dal. Tobě děkuji za radu a jdu na to kouknout. Zkusím udělat ty další, tak mi je prosím zkontroluj.
Petr Štechmüller:28.2.2017 19:21
Jasný, není problém. Stáhni si JUnit ve verzi 4, nebo 5. Trojka je dost stará a 5 zase moc nová. Ten příklad je pro verzi 4.
Qestin:28.2.2017 19:25
Momentálně na to koukám a mám verzi 4.12 ? Je to možný ?
Qestin:28.2.2017 19:54
package Roman;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import junit.framework.*;
public class RomanTest extends TestCase {
class Dvojice {
int arab;
String roman;
Dvojice(int arab, String roman) {
this.arab = arab;
this.roman = roman;
}
};
Dvojice knownValues[] = {
new Dvojice(1, "I"),
new Dvojice(2, "II"),
new Dvojice(3, "III"),
new Dvojice(4, "IV"),
new Dvojice(5, "V"),
new Dvojice(6, "VI"),
new Dvojice(7, "VII"),
new Dvojice(8, "VIII"),
new Dvojice(9, "IX"),
new Dvojice(10, "X"),
new Dvojice(50, "L"),
new Dvojice(100, "C"),
new Dvojice(500, "D"),
new Dvojice(1000, "M"),
new Dvojice(31, "XXXI"),
new Dvojice(148, "CXLVIII"),
new Dvojice(294, "CCXCIV"),
new Dvojice(312, "CCCXII"),
new Dvojice(421, "CDXXI"),
new Dvojice(528, "DXXVIII"),
new Dvojice(621, "DCXXI"),
new Dvojice(782, "DCCLXXXII"),
new Dvojice(870, "DCCCLXX"),
new Dvojice(941, "CMXLI"),
new Dvojice(1043, "MXLIII"),
new Dvojice(1110, "MCX"),
new Dvojice(1226, "MCCXXVI"),
new Dvojice(1301, "MCCCI"),
new Dvojice(1485, "MCDLXXXV"),
new Dvojice(1509, "MDIX"),
new Dvojice(1607, "MDCVII"),
new Dvojice(2499, "MMCDXCIX"),
new Dvojice(2574, "MMDLXXIV"),
new Dvojice(2646, "MMDCXLVI"),
new Dvojice(2723, "MMDCCXXIII"),
new Dvojice(2892, "MMDCCCXCII"),
new Dvojice(2975, "MMCMLXXV"),
new Dvojice(3051, "MMMLI"),
new Dvojice(3313, "MMMCCCXIII"),
new Dvojice(3408, "MMMCDVIII"),
new Dvojice(3501, "MMMDI"),
new Dvojice(3610, "MMMDCX"),
new Dvojice(3743, "MMMDCCXLIII"),
new Dvojice(3844, "MMMDCCCXLIV"),
new Dvojice(3888, "MMMDCCCLXXXVIII"),
new Dvojice(3940, "MMMCMXL"),
new Dvojice(3999, "MMMCMXCIX"),};
public RomanTest(String name) {
super(name);
}
protected void setUp() {
}
public void testToRomanKnownValues() {
for (int i = 0; i < knownValues.length; i++) {
String vysl = Roman.toRoman(knownValues[i].arab);
assertEquals(knownValues[i].roman, vysl);
}
}
public void testFromRomanKnownValues() {
for (int i = 0; i < knownValues.length; i++) {
int vysl = Roman.fromRoman(knownValues[i].roman);
assertEquals(knownValues[i].arab, vysl);
}
}
public void testToRomanException() {
int badValues[] = {0, -1, 4000};
for (int i = 0; i < badValues.length; i++) {
try {
String vysl = Roman.toRoman(badValues[i]);
} catch (IllegalArgumentException e) {
continue;
}
fail("Expected IllegalArgumentException");
};
}
public void testIllegalCharacters() {
String badValues[] = {"I ", "i", "a", "mm", "d", "MCi"};
for (int i = 0; i < badValues.length; i++) {
try {
int vysl = Roman.fromRoman(badValues[i]);
} catch (NumberFormatException e) {
continue;
}
fail("Expected IllegalArgumentException for " + badValues[i]);
};
}
public void testTooManyRepeatedNumerals() {
String badValues[] = {"MMMM", "VV", "LL", "CCCC", "DD", "IIII"};
for (int i = 0; i < badValues.length; i++) {
try {
int vysl = Roman.fromRoman(badValues[i]);
} catch (NumberFormatException e) {
continue;
}
fail("Expected IllegalArgumentException for " + badValues[i]);
};
}
public void testRepeatedPairs() {
String badValues[] = {"CMCM", "CDCD", "IVIV", "IXIX", "XLXL"};
for (int i = 0; i < badValues.length; i++) {
try {
int vysl = Roman.fromRoman(badValues[i]);
} catch (NumberFormatException e) {
continue;
}
fail("Expected IllegalArgumentException for " + badValues[i]);
};
}
public void testMalformedAntecedent() {
String badValues[] = {"IIMMCC", "VX", "DCM", "CMM", "CMD", "IXIV", "MCMC",
"XCX", "IVI", "LM", "LD", "LC"};
int vysl;
for (int i = 0; i < badValues.length; i++) {
try {
vysl = Roman.fromRoman(badValues[i]);
} catch (NumberFormatException e) {
continue;
}
fail("Expected IllegalArgumentException for " + badValues[i] + " (" + vysl);
};
}
public void testSanity() {
for (int i = 1; i < 4000; i++) {
int vysl = Roman.fromRoman(Roman.toRoman(i));
assertEquals(i, vysl);
};
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static TestSuite suite() {
return new TestSuite(RomanTest.class);
}
};
Trochu jsem to teď pozměnil a nevím, zda je to teď dobře, vypisuje mi to tohle:
run:
..F..F..F..F
Time: 0,03
There were 4 failures:
- testRepeatedPairs(Roman.RomanTest)junit.framework.AssertionFailedError:
Expected IllegalArgumentException for CMCM
at Roman.RomanTest.testRepeatedPairs(RomanTest.java:139)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at Roman.RomanTest.main(RomanTest.java:165)
- testIllegalCharacters(Roman.RomanTest)junit.framework.AssertionFailedError:
Expected IllegalArgumentException for i
at Roman.RomanTest.testIllegalCharacters(RomanTest.java:115)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at Roman.RomanTest.main(RomanTest.java:165)
- testMalformedAntecedent(Roman.RomanTest)junit.framework.AssertionFailedError:
Expected IllegalArgumentException for IIMMCC (2198
at Roman.RomanTest.testMalformedAntecedent(RomanTest.java:153)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at Roman.RomanTest.main(RomanTest.java:165)
- testTooManyRepeatedNumerals(Roman.RomanTest)junit.framework.AssertionFailedError:
Expected IllegalArgumentException for MMMM
at Roman.RomanTest.testTooManyRepeatedNumerals(RomanTest.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at Roman.RomanTest.main(RomanTest.java:165)
FAILURES!!!
Tests run: 8, Failures: 4, Errors: 0
Jsem teď z toho celého zmatený, že vůbec nevím co mi to říká?
Petr Štechmüller:28.2.2017 20:00
Četl jsi vůbec ten můj kód? Pořád nechápu, proč děláš vlastní try/catch bloky. Ty by v testech vůbec neměly být
Qestin:28.2.2017 20:05
Jojo, ale bohužel to dohromady nedám.
Qestin:28.2.2017 20:08
Tady spíš o to, že se musím držet zadání a to tvoje je úplně jiný. Takže se snažím udělat to co mám.
Petr Pek:2.3.2017 17:28
Zdravím,
zkoušel jsem si ten test, a aby fungoval, musel jsem si přidat anotaci:
@RunWith(value = Parameterized.class)
použil jsem junit 4.12
Petr Štechmüller:2.3.2017 17:29
Jo jasný, to jsem asi nějak zapomněl přidat...
btw to value tam nemusí být. Stačí, když to bude takto:
@RunWith(Parameterized.class)
Zobrazeno 15 zpráv z 15.