AntonioGanci

Il blog di Antonio Ganci
posts - 201, comments - 578, trackbacks - 27

Scrivere Acceptance Test per una applicazione Wpf

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.

Print | posted on giovedì 19 agosto 2010 10.55 | Filed Under [ Tips Extreme Programming ]

Feedback

Gravatar

# re: Scrivere Acceptance Test per una applicazione Wpf

ciao Antonio, l'ultima volta che ho fatto una cosa simile era ancora con .NET 2.0, e la chiamata a .Show() era "opzionale", nel senso che gran parte dei comportamenti erano testabili anche senza. Uncle Bob però consigliava, come fai tu, di rendere visibile la form, per evitare strani effetti.

qui un vecchissimo report (gennaio 2007!!) del lavoro che avevo svolto, in fondo c'è l'esempio della GUI:
* jfranzoi.wordpress.com/.../esempio-semplice-di-...

aspetto i tuoi esempi ;)
22/08/2010 12.25 | Jacopo
Gravatar

# re: Scrivere Acceptance Test per una applicazione Wpf

x Jacopo:
Interessante il post che avevi scritto, ho visto che hai usato FitNesse, magari lo provo sul mio progetto per capire se la leggibilità migliora.

Si possono testare alcuni comportamenti senza Show, ma ci sono eventi che se il controllo non è visibile non vengono generati (tipo checked di una check box).
Qui uso Wpf che per alcuni versi è simile a WinForm per altri è molto diverso. Gli esempi arriveranno a breve :-).
23/08/2010 11.46 | Antonio Ganci

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 1 and 6 and type the answer here:

Powered by: