Sin dalle prime versioni di Visual Studio Team System (parlo della beta 1) ho notato una grossa mancanza: un test type dedicato ai web services. Ho sempre pensato (sperato) che prima o poi l'avrebbero introdotto, ma ahimè siamo arrivati all'RTM e niente.

Quindi, la mia scelta è caduta sullo Unit testing. Perchè unit testing ? Semplice, la classe proxy (del web service) è una classe che può essere testata come un OM, al pari di qualsiasi class library.

Nota: E' importante ricordare che se volete il supporto dei wizard per la generazione automatica dello scheletro delle test classe e test methods dovete mettere la classe proxy in una class library esterna e non nel progetto di testing.

Effettuando i test il tutto funziona egregiamente. I problemi sorgono quando si fanno i test di carico (load test). Infatti, lo unit testing è particolarmente pesante anche per PC con buone caratteristiche (dual xeon 3GHX con 2 GB di RAM). Facendo delle prove non riuscivo a superare i 200 utenti concorrenti. Leggendo una nota della documentazione (molto nascosta) scopro che:

1.36   Visual Studio 2005 Team Edition for Testers: Set the Proxy Property of a SoapHttpClientProtocol Implementations to Null
If you are running a load test containing unit tests that call Web services, the unit test code should explicitly set the proxy property of the Web service proxy class that implements System.Web.Services.Protocols.SoapHttpClientProtocol. This prevents a performance bottleneck that can occur when the proxy must be automatically detected.

Da prove empiriche (provato con 8 agent con caratteristiche simili a quelle menzionate pocanzi) ho notato che questa modifica non migliora di molto.

Un notevole miglioramento si ha invece facendo il web test. Se create un progetto di web test vuoto (senza registrare sessioni) avete la possibilità di effettuare una chiata ad un web service impostandone il body...ricordo che la chiamata ad un web service altro non è che un messaggio SOAP in POST !

Basta recuperare il payload SOAP con un trace oppure usando WebServiceStudio. Si copia l'XML nel body ed il gioco è fatto. Essendo un web test avete sempre la possibilità di agganciare variabili provenienti da un datasource o da una variabile di contesto esterna, es:

<soap:Body>
    <getSecurityPricesRequest xmlns="
http://services.peway.com/security/v3/messages">
      <codes>{{SID}}</codes>
      <HistoryPricePeriod DateFrom="2000-04-03T00:00:00" DateTo="2005-11-30T00:00:00" />
    </getSecurityPricesRequest>
  </soap:Body>