TU Wien:Software-Qualitätssicherung VU (Biffl)/Praxis Test SS17-18

Aus VoWi
Zur Navigation springen Zur Suche springen

Link zu den Bildern der Prüfung: Datei:TU Wien-Software-Qualitätssicherung VU (Biffl) - Praxis Test SS17-18.zip

zusätzlich war noch ein Beispiel aus dem Praxisvortrag (entsprach dem Beispiel "Mythen und Fakten", siehe Folien 20-23, man musste aus einem gegebenen Text Mythen und deren Ursprung identifizieren)

Nachtest war vom Schema der Beispiele ziemlich das selbe.

Hier gibt es den Test in abgeschriebener Rohfassung, zum Üben:

Aufgabe 1[Bearbeiten | Quelltext bearbeiten]

Ein Online-Lieferdienst für Lebensmittel führt ein Bonuspunktesystem ein. Bestellungen sind als registrierter sowie als anonymer Kunde möglich. Registrierte Kunden erhalten ab einer Einkaufssumme von ≥ 10€ nach dem Einkauf zwei Bonuspunkte gutgeschrieben. Ab zehn Bonuspunkten werden diese automatisch eingelöst und die Einkaufssumme wird um 2€ reduziert. Definieren sie anhand der gegebenen Informationen alle Äquivalenzklassen. Und geben sie zwei wichtige Testfälle (nicht JUnit-Tests) auf Basis von Grenzwerten an.

Aufgabe 2[Bearbeiten | Quelltext bearbeiten]

Kann für die Klasse MoneyTransferService ein Integrationstest mit Hilfe von Mocking durchgeführt werden? Begründen Sie Ihre Antwort ausführlich.

public class MoneyTransferService {

   private BankService bs;

   public void setBankService(BankService bs) { this.bs = bs; }

   public MoneyTransferResult transferMoney(String ibanFrom, String ibanTo, int amount)  {
       this.bs = new SimpleBankService();
       if(!isValid(ibanFrom))
           throw new InvalidIbanException("Invalid from IBAN");
       if(!isValid(ibanTo))
           throw new InvalidIbanException("Invalid to IBAN");
       if(amount <= 0)
           throw new InvalidAmountException("Amount must be positive");
       return bs.transfer(ibanFrom, ibanTo, amount);
   }

}

Aufgabe 3[Bearbeiten | Quelltext bearbeiten]

Führen Sie ein Review der nachfolgenden (JUnit 4) Testfälle durch.

public class SetTest {

    private static Set<Integer> integersSet;

    @BeforeClass
    public static void setUp() {
       integersSet = new HashSet<>();
       integersSet.add(1);
       integersSet.add(2);
       integersSet.add(3);
    }

    @Test
    public void testSetDoesSomethingShouldFail() {
        assert(!integersSet.remove(3));
    }

    @Test
    public void setRemoveShouldReturnTrueIfElementIsRemoved() {
        for(int i = 1; i <= 3; i++) {
            if(!integersSet.remove(i))
                throw new IllegalStateException("Failed to remove value from set");
        }
    }

    @Test(expected = IllegalStateException.class)
    public void addingExistingElementToSetShouldEnsureElementExistsOnlyOnce() {
        integersSet.add(1);
        integersSet.remove(1);
        if(!integersSet.remove(1))
            throw new IllegalStateException("Failed to remove value from set");
    }
}

Finden Sie fünf Fehler in der Implementierung der Testfälle, geben sie die Zeilennummern an und erklären Sie die gefundenen Probleme und geben Sie Vorschläge zur Behebung. Achten Sie im Speziellen auf Testing Bad Practices! Hinweis: Sollte ein Fehler mehrfach vorkommen, zählt dieser nur als ein Fehler.

Aufgabe 4[Bearbeiten | Quelltext bearbeiten]

Bei der folgenden Klasse AlarmService handelt es sich um ein Service das zwischen einer definierten Startzeit und Endzeit eine Alarmanlage aktiviert. testen Sie die Methode isAlarmActive(int startHour, int endHour, boolean daylightSaving) auf ihre Korrekte Funktionsweise, indem Sie folgende Testfälle in JUnit-Syntax mit mocking implementieren. (Verwenden Sie kein Mocking Framework!).

  1. startHour = 20, endHour = 6, daylightSaving = false; result: true
  2. startHour = 8, endHour = 16, daylightSaving = true; result: false
interface Clock {
    // throws IllegalArgumentException if timeZoneOffset is not in range [+-24]
    Integer getDayTimeInMillis(Integer timeZoneOffset) throws IllegalArgumentException;
}

class AlarmService {
    private Clock clock;
    public boolean isAlarmActive(int startHour, int endHour, boolean daylightSaving) {
        Integer dayTime = clock.getDayTimeInMillis(daylightSaving ? 1 : 0) / 1000 / 60 / 60;
        if(startHour <= endHour) return (dayTime >= startHour) && (dayTime <= endHour);
        else return (dayTime <= startHour) && (dayTime >= endHour);
    }
    public void setClock(Clock clock) { this.clock = clock; }
}

Aufgabe 5[Bearbeiten | Quelltext bearbeiten]

Implementieren Sie folgende vorgegebenen Tests in JUnit

  1. removeCorrectValueForGivenKey();
    Überprüft ob für den richtigen Value der richtige Key zurückgegeben und aus der Map entfernt wird.
  2. removeShouldFailWhenKeyDoesNotExist();
    Überprüft ob eine NoSuchElementException beim Aufruf von remove geworfen wird, wenn der Key nicht existiert.
  3. removeAllShouldRemoveAllElements();
    Überprüft ob alle Elemente aus der Map entfernt wurden.

Ihre Aufgabe ist die Überprüfung der korrekten Funktionsweise der Methoden remove(<key>) und removeAll(). Die Methode remove(<key>) liefert den Wert am angegebenen Key und entfernt ihn aus der Map. Sollte die Map an der Stelle leer sein, wird eine NoSuchElementException geworfen. Die Methode removeAll() löscht alle Elemente. Zusätzlich steht Ihnen die sicher richtig implementierte Methode size zur Verfügung, die die Anzahl der Elemente in der Map zurückliefert.

public class MapTest {
    private MyMap<String, Integer> map;
    private static final String NAME_1 = "Jane";
    private static final String NAME_2 = "John";
    private static final Integer AGE_1 = 25;
    private static final Integer AGE_2 = 26;
    @Before
    public void setUp() {
        map = MyMap<>();
        map.put(NAME_1, AGE_1);
        map.put(NAME_2, AGE_2);
    }