Jestem w takim momencie mojej nauki, że (wydaje mi się) są mi już potrzebne testy jednostkowe. Projekty zaczynają mieć kilka klas, myślę o ich rozwoju, dodawaniu nowych featureów, coś o abstrakcji też (ale ciągle denerwuje mnie istnienie interfejsów, z których notabene nie wiem jak korzystać poprawnie).
I mam tu parę pytań:
- Kiedy pisanie testów powinno mieć miejsce? [Przed/W trakcie/Po napisaniu kodu]
- Czy testy powinny sprawdzać zachowanie konkretnych metod czy części działań?
- Jeżeli mają sprawdzać zachowania konkretnych metod to czy testy powinny być napisane przed stworzeniem kodu wykonawczego? Jeśli tak to jak tego dokonać?
- Czy testy jednostkowe powinny sprawdzać zmiany w plikach?
- Jeżeli tak to jak przykładowo wyglądałby test takiej metody?
public static Optional<List<String>> loadDataFromFile(File file) { List<String> rawFileContent = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line; while ((line = reader.readLine()) != null ) { rawFileContent.add(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return Optional.ofNullable(rawFileContent); }
- Czy testy jednostkowe są miarą jakości kodu?
- Czy testy powinny sprawdzać lokalną obsługę wyjątków, tj. czy kod znajdujący się w klauzuli
catch
jest wykonywany poprawnie? (Nie korzystam z przekształceń checked na runtime, nie wiem jak to się obsługuje i czy jest lepsze) - Czy testy powinny sprawdzać zachowania klas reprezentujące pewne dane? Przykład poniżej
package game;
public class Cell {
private CellState state;
public Cell(CellState state) {
this.state = state;
}
public Cell setAlive() {
state = CellState.Alive;
return this;
}
public Cell setDead() {
state = CellState.Dead;
return this;
}
public boolean isDead() {
return this.state.equals(CellState.Dead);
}
public boolean isAlive() {
return this.state.equals(CellState.Alive);
}
public CellState getState() {
return state;
}
@Override
public boolean equals(Object obj) {
Cell argument = (Cell) obj;
return argument.getStateAsString().equals(this.getStateAsString());
}
public String getStateAsString() {
return state.toString();
}
@Override
public String toString() {
return state.toString();
}
}
- Czy testy wymagające stworzenia skomplikowanego przykładu (np. tablicy do gry z konkretnym rozstawieniem pionków/jednostek, etc.) ciągle są testami jednostkowymi?
- Czy używanie interfejsów wpływa na łatwość pisania testów/ich jakość/czytelność?
Pewnie w trakcie dyskusji będę miał jeszcze jakieś pytania, liczę na waszą wyrozumiałość ;)