Gli acceptance test servono a verificare che una user story
sia stata realizzata correttamente, quindi sono test definiti insieme al cliente o addirittura scritti dal cliente.
L'applicazione che stiamo scrivendo utilizza wpf, quindi la nostra necessità è quella di poter aprire finestre,
cliccare sui pulsanti, ecc. all'interno di un test automatico.
Esistono approcci alternativi a quello che propongo in questo post, come ad esempio le
TestApi, le quali utilizzano le
automation api mentre per l'input del mouse e della tastiera
utilizzano l'API SendInput.
Le TestApi fanno molto di più di quello che a noi serve e quindi ho cercato un approccio più adatto al nostro caso.
Per prima cosa creiamo un progetto di Test che referenzia l'assembly con la finestra sotto test e scriviamo il seguente codice:
[TestFixture]
public class MainWindowTest
{
[Test]
public void ShowTheMainWindow()
{
var window = new MainWindow();
window.Show();
}
}
Se proviamo ad eseguirlo ottienamo il seguente errore:
System.InvalidOperationException : The calling thread must be STA, because many UI components require this.
Il motivo dell'errore è che il default apartment state è MTA, normalmente lo si imposta come attributo del metodo Main, purtroppo in questo caso il main si trova nel test runner.
Per risolvere il problema dobbiamo aggiungere al progetto l'Application Configuration File (App.config) ed inserire la
seguente configurazione:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="NUnit">
<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections>
<NUnit>
<TestRunner>
<add key="ApartmentState" value="STA" />
</TestRunner>
</NUnit>
</configuration>
Se proviamo a lanciare il test ora passa senza problemi; come test runner uso quello di Resharper per cui non so se con
altri test runner la soluzione proposta funzioni correttamente.
Vedremo una tecnica per mandare gli eventi ai controlli nel prossimo post.