Come scrivere un test unitario per un intervallo (diciamo percentuale)?

1

Immagina di avere una classe che rappresenta una percentuale. Questa classe fornisce auto-convalida attraverso le eccezioni, non consentendo valori inferiori a 0 o superiori a 100 rispettivamente.

Quando si segue TDD, la funzionalità di un metodo / classe dovrebbe essere evidente dal test che sta testando la parte del codice. Se un test in questo caso include un intervallo?

Pseudocodice:

testNegativeValuesAreNotAccepted() {
    try {
        Percentage::withValue(Integer.random(Integer.MIN, -1));

        Assert.fail("Percentage MUST NOT accept negative values.");
    } catch (InvalidPercentageValue e) {
    }
}

testPercentageIsCreatedWithCorrectValue() {
    Integer value = Integer.random(0, 100);

    Percentage percentage = Percentage::withValue(Integer.random(0, 100));

    Assert.equals(true, value.equals(percentage.value()));
}

testValuesOver100AreNotAccepted() {
    try {
        Percentage::withValue(Integer.random(101, Integer.MAX));

        Assert.fail("Percentage MUST NOT accept values over 100.");
    } catch (InvalidPercentageValue e) {
    }
}

Questo darebbe allo sviluppatore della classe Percentage informazioni sufficienti per lui per programmare la classe? C'è forse troppa informazione per loro? In che modo questo problema di autonomia può essere risolto in modo diverso?

    
posta Andy 25.07.2017 - 13:15
fonte

1 risposta

3

Se si desidera testare un intervallo, inline alcuni dati per il test. Sto usando Xunit qui, ma tecniche simili si applicano ad altri framework.

    [Theory]
    [InlineData(0)]
    [InlineData(20)]
    [InlineData(100)]
    public void HappyPathPercentage(int input)
    {
          //Arrange
          //Act
          //Assert
    }

    [Theory]
    [InlineData(-1)]
    [InlineData(101)]
    public void FailPathPercentage(int input)
    {
          //Arrange
          //Act
          //Assert
    }
    
risposta data 25.07.2017 - 17:10
fonte

Leggi altre domande sui tag