Test di modifica dello stato

1

Nel capitolo 3 del suo libro The Art of Unit Testing: con esempi in C # , Roy Osherove descrive il concetto di test di modifica dello stato di un sistema.

Il codice di esempio sotto test che usa è simile a questo:

public class LogAnalyzer
{
    public bool WasLastFileNameValid { get; set; }

    public bool IsValidLogFileName(string filename)
    {
        WasLastFileNameValid = false;

        if (string.IsNullOrEmpty(filename))
        {
            throw new ArgumentException("filename has to be provided");
        }

        if (filename.EndsWith(".SLF", StringComparison.InvariantCultureIgnoreCase))
        {
            WasLastFileNameValid = true;
            return true;
        }
        return false;
    }
}

e vogliamo testare lo stato della proprietà WasLastFileNameValid .

A tal fine, l'autore utilizza il seguente test:

[Test]
public void IsValidFileName_WhenCalled_ChangesWasLastFileNameValid()
{
  LogAnalyzer la = MakeAnalyzer();

  la.IsValidLogFileName("badname.foo");

  Assert.False(la.WasLastFileNameValid);
}

Tuttavia, vedo i seguenti problemi con questo test:

  1. La parte "risultato" del nome del test è ChangesWasLastFileNameValid , ma il test in realtà non controlla se il valore della proprietà cambia; potrebbe essere stato false anche prima della chiamata a IsValidLogFileName .
  2. Il test verifica solo il caso in cui l'ultima chiamata era un nome file non valido.

Vorrei usare il seguente test (usando xunit.net )

    [Theory]
    [InlineData(true, "fileWithValidExtension.SLF", true)]
    [InlineData(true, "fileWithBadExtension.FOO", false)]
    [InlineData(false, "fileWithValidExtension.SLF", true)]
    [InlineData(false, "fileWithBadExtension.FOO", false)]
    public void IsValidLogFileName_WhenCalled_ChangesWasLastFileNameValid(
        bool preState, string filename, bool postState)
    {
        LogAnalyzer analyzer = new LogAnalyzer();
        analyzer.WasLastFileNameValid = preState;

        analyzer.IsValidLogFileName(filename);

        Assert.Equal<bool>(postState, analyzer.WasLastFileNameValid);
    }

Qui provo se il valore cambia e collaudo anche tutti gli scenari. È un test migliore?

    
posta Isaac Kleinman 03.09.2014 - 22:41
fonte

1 risposta

2

Per rispondere ai tuoi dubbi specifici:

  1. Se un cambiamento di stato si verifica non è necessariamente rilevante, solo che esiste lo stato corretto al momento del test.

  2. Entrambi gli stati dovrebbero essere testati rispetto alle loro condizioni pertinenti, non solo uno o l'altro.

Probabilmente è una progettazione software migliore se al momento viene chiamato il metodo IsValidLogFileName() nel momento in cui è necessaria una valutazione del nome del file, piuttosto che provare a mantenere una variabile di stato con tali informazioni. Dovrebbe essere ridisegnato per essere apolidi, in altre parole (a parità di tutte le altre cose).

    
risposta data 03.09.2014 - 23:00
fonte

Leggi altre domande sui tag