Utvecklingstips

Testa ditt Web API med RestSharp

Jag satt för ett tag sedan med uppgiften att skriva automatiserade tester av ett REST-API byggt med MS Web API. Eftersom Visual Studio var vår utvecklingsmiljö och vi hade Continous Integration med tester på plats i TFSen tänkte jag att jag skulle använda inbyggda MSTest och inte blanda in en best som till exempel SoapUI.

Jag började glad i hågen koda och skapade min testklass. Ok, hur konsumerar jag REST-tjänster från C#? Googlande gav mig den här artikeln http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/. Hmm… det var mycket kod, någon borde ha gjort det här redan. Lite mer letande efter REST-klienter gav mig lite olika kandidater men valet föll till slut på https://github.com/restsharp/RestSharp som finns som NuGet-paket.

RestSharp ger massor av fina funktioner för att wrappa all kod kring HttpClient, endpoints m.m. Nu kan jag skriva ett test med bara några få rader.

[TestClass]
    public class MyTests
    {
        private string serviceRootUrl;
        private RestClient client;

        [TestInitialize]
        public void SetUp()
        {
            serviceRootUrl = "http://root.rest-api.domain";
            client = new RestClient(serviceRootUrl);
        }

 
        [TestMethod]
        public void RestApi_ExistingKlient()
        {
            var personId = "4711";

            var request = new RestRequest("person/{id}", Method.GET);
            request.AddUrlSegment("id", personId);

            var response = client.Execute<Person>(request);

            Assert.AreEqual(personId, response.Data.Id);
            Assert.AreEqual("Test", response.Data.Fornamn);
            Assert.AreEqual("Testsson", response.Data.Efternamn);
        }
    }

I testet ovan testar jag att routen för att hämta en person fungerar och att jag får tillbaka den förväntade person. Jag har dessutom en modell på klientsidan som heter Person som RestSharp deserialiserar åt mig.

Jag kan enkelt testa att en viss route returnerar rätt http-status. Som här där jag verifierar att man inte får anropa person-routen.

[TestMethod]
        public void RestApi_PersonRootNotAllowed()
        {
            var request = new RestRequest("person", Method.GET);

            var response = client.Execute(request);
            Assert.AreEqual(HttpStatusCode.MethodNotAllowed, response.StatusCode);
        }

Om man frågar efter en person som inte finns:

[TestMethod]
        public void RestApi_NonExistingPersonStatusCode()
        {
            var personId = "-1";

            var request = new RestRequest("person/{id}", Method.GET);
            request.AddUrlSegment("id", personId);

            var response = client.Execute(request);
            Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
        }

Man kan även analysera den JSON som tjänsten returnerar, utan att RestSharp deserialiserar den till ett objekt. Man kan till exempel försöka försäkra mig att uppgifter som anses konfidentiella inte exponeras via tjänsterna. Här är ett exempel som ska förhindra att personers adresser inte exponeras:

[TestMethod]
        public void RestApi_PersonContainsNoAddressInformation()
        {
            var personId = "4711";
            var request = new RestRequest("person/{id}", Method.GET);
            request.AddUrlSegment("id", personId);
            var response = client.Execute(request);
            Assert.IsFalse(response.Content.ToLower().Contains("adress"));
        }

Det finns mer att läsa om RestSharp på http://restsharp.org/.

Happy testing!

Kom ihåg, har du inte tester på din kod blir du rädd att ändra den. Blir du rätt att ändra den kommer du skriva ytterligare kod som gör ungefär samma sak. Din kod växer. Din kod börjar ruttna. Det där var fritt tolkat från en bra bok, Clean code av Robert C. Martin (http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882).

Andra bloggar om: 
 
Martin Loman

2013-02-01 kl. 13:53

Web Analytics