Quando utilizzo VS per generare i test di unità, ho ottenuto Assert.Inclusive per i metodi di test generati e in genere cambio l'asserzione in modo da qualcos'altro quando li lavoro. Uso i punti interrogativi di Assert.Inclusive nei risultati del test come indicatori per indicare rapidamente quali test non ho ancora completato.
Bene, è solo il modo in cui lo uso. Dal suo nome "Inconcludente", immagino che tu possa usare per indicare il tuo stato indeterministico finché documenterai cosa significa.
Tuttavia, dalla descrizione del tuo metodo Average()
, penso che forse il tuo test unitario non sia abbastanza atomico da coprire solo una "unità", uno scenario specifico. A volte, scrivo 2 o 3 metodi di test unitari per un singolo metodo. Oppure puoi rompere il tuo metodo Average()
in metodi più piccoli che coprono singole responsabilità. In questo modo, puoi testare l'unità con quei metodi più piccoli prima di testare l'unità con uno Average()
.
Johannes,
Questo è come vorrei attuare le Sum()
e Average()
metodi.
public static class MyMath
{
private static void ValidateInput(ICollection<int> numbers)
{
if (numbers == null)
throw new ArgumentNullException("numbers", "Null input. Nothing to compute!");
if (numbers.Count == 0)
throw new ArgumentException("Input is empty. Nothing to compute!");
}
public static int Sum(int[] numbers)
{
ValidateInput(numbers);
var total = 0;
foreach (var number in numbers)
total += number;
return total;
}
public static double Average(int[] numbers)
{
ValidateInput(numbers);
return Sum(numbers)/numbers.Length;
}
}
Per semplicità, ho solo buttare ArgumentException
eccezioni il metodo ValidateInput(ICollection<int>)
. È inoltre possibile verificare la possibilità di overflow e lanciare OverflowException
nel metodo ValidateInput(ICollection<int>)
.
Detto ciò, ecco come testare la funzione Average(int[])
.
[TestMethod]
public void AverageTest_GoodInput()
{
int[] numbers = {1, 2, 3};
const double expected = 2.0;
var actual = MyMath.Average(numbers);
Assert.AreEqual(expected, actual);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void AverageTest_NullInput()
{
int[] numbers = null;
MyMath.Average(numbers);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void AverageTest_EmptyInput()
{
var numbers = new int[0];
MyMath.Average(numbers);
}
Con questi test di installazione, posso essere certo che quando tutti i test passano, la mia funzione è corretta. Bene, tranne per il caso di overflow. Ora posso tornare al metodo ValidateInput(ICollection<int>)
per aggiungere la logica per verificare l'overflow, quindi aggiungere un altro test per aspettarsi che il OverflowException
venga generato per il tipo di input che causano un overflow. O farlo nell'ordine opposto se ti piace avvicinarti con TDD.
Spero che questo aiuti a chiarire l'idea.
potresti per favore elaborare come ti avvicineresti a questo in questo caso molto speciale –
grazie mille. quindi in sostanza stai dicendo che non è necessario scrivere un test esplicito per Sum(), ma testarlo tramite Average(). Dal punto di vista della copertura del codice, questo genera comunque lo stesso risultato. –
Scriverò anche test per Sum(). Chi lo sa nel mio assonnato momento, potrei digitare il '-' invece del '/'. :) Con i test per Sum() sul posto, se ho ottenuto tutti i test per Sum() ma alcuni test per Average() non riescono, posso essere molto certo che l'implementazione di Average() sia errata. Non sarò in grado di incolpare Sum() per aver causato che Average() sia errato. :) – tranmq