Pruebas Unitarias – Servicio REST sobre WCF

Publicada en Publicada en Sin Categoria

Compartelo con tus amigos!

Hola a todos!

Nuevamente estamos aquí, pero está vez para concluir con los objetivos de la entrada anterior “Desarrollando un Servicio REST sobre WCF” (Sí no la has visto aún, te invito a que te tomes unos minutos para leerla :D)

El objetivo que teníamos pendiente era Implementar pruebas unitarias del servicio Actividades.svc

Empecemos!

Para este ejemplo, usaremos: SQL Server 2017 y Visual Studio 2017 Community (bajo C#).

Del mismo modo, continuaremos trabajando sobre la solución PeruNETDevelopment.Rest.

En primer lugar, agregaremos un proyecto del tipo Prueba Unitaria el cual encontraremos en Prueba. Lo llamaremos PeruNETDevelopment.Test. (Figura 1)

(Figura 1)

Luego de crear nuestro proyecto, observaremos la siguiente estructura en la ventana del explorador de soluciones. (Figura 2)

(Figura 2)

Para ello hemos eliminado la clase UnitTest1.cs, la cual es generada por default en el proyecto y añadimos las siguientes:

  • ActividadServicesTest: Agregamos un nuevo elemento del tipo Prueba Unitaria al cual llamaremos ActividadServicesTest.cs. (Figura 3).

(Figura 3)

  • DuplicadoException: Agregaremos un nuevo elemento del tipo Clase al cual llamaremos DuplicadoException.cs. (Figura 4)

(Figura 4)

Editaremos el archivo DuplicadoException.cs:

namespace PeruNETDevelopment.test
{
    public class DuplicadoException
    {
        public int Codigo { get; set; }
        public string Descripcion { get; set; }
    }
}

Editaremos el archivo ActividadServicesTest.cs:

La clase de prueba debe contener:

  • El atributo [TestClass] se requiere en el marco de pruebas unitarias para código administrado de Microsoft para cualquier clase que contenga métodos de prueba unitaria que desee ejecutar en el Explorador de pruebas.
  • Cada método de prueba que desee que ejecute el Explorador de pruebas debe tener el atributo [TestMethod].

Para el caso de las pruebas unitarias se usará el siguiente formato que consta de tres partes: [Metodo]_[Escenario]_[Comportamiento].

Los test realizados son los siguientes:

  • CrearActividad_RegistroCorrecto_RetornaActividadCreada
    • Escenario 1: Crea actividad con datos correcto.
    • Escenario 2:  Retorna mensaje de error 101, actividad ya existe.
[TestMethod]
public void CrearActividad_RegistroCorrecto_RetornaActividadCreada()
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    Actividad actividadACrear = new Actividad()
    {
        nActividad = "A000003",
        cCliente = "12345678",
        cUsuario = "1234",
        cTipoActividad = "3",
        dDescripcion = "Actividad de Prueba",
        dAsunto = "Activdad nueva",
        sEstado = "C"
    };
    string postdata = js.Serialize(actividadACrear);
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8186/Actividades.svc/Actividades");
    request.Method = "POST";
    request.ContentLength = data.Length;
    request.ContentType = "application/json";
    var requeststream = request.GetRequestStream();
    requeststream.Write(data, 0, data.Length);

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tramaJson = reader.ReadToEnd();
    Actividad actividadCreada = js.Deserialize<Actividad>(tramaJson);
    Assert.AreEqual("A000003", actividadCreada.nActividad);
    Assert.AreEqual("12345678", actividadCreada.cCliente);
    Assert.AreEqual("1234", actividadCreada.cUsuario);
    Assert.AreEqual("3", actividadCreada.cTipoActividad);
    Assert.AreEqual("Actividad de Prueba", actividadCreada.dDescripcion);
    Assert.AreEqual("C", actividadCreada.sEstado);
}
 
[TestMethod]
public void CrearActividad_ActividadDuplicada_RetornaMensajeError101()
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    Actividad actividadACrear = new Actividad()
    {
        nActividad = "A000003",
        cCliente = "12345678",
        cUsuario = "1234",
        cTipoActividad = "3",
        dDescripcion = "Actividad de Prueba",
        dAsunto = "Actividad nueva",
        sEstado = "C"
    };
    string postdata = js.Serialize(actividadACrear);
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8186/Actividades.svc/Actividades");
    request.Method = "POST";
    request.ContentLength = data.Length;
    request.ContentType = "application/json";
    var requeststream = request.GetRequestStream();
    requeststream.Write(data, 0, data.Length);
    try
    {
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string tramaJson = reader.ReadToEnd();
        Actividad actividadCreada = js.Deserialize<Actividad>(tramaJson);
        Assert.AreEqual("A000003", actividadCreada.nActividad);
        Assert.AreEqual("12345678", actividadCreada.cCliente);
        Assert.AreEqual("1234", actividadCreada.cUsuario);
        Assert.AreEqual("3", actividadCreada.cTipoActividad);
        Assert.AreEqual("Actividad de Prueba", actividadCreada.dDescripcion);
        Assert.AreEqual("C", actividadCreada.sEstado);
    }
    catch (WebException e)
    {
        HttpStatusCode codigo = ((HttpWebResponse)e.Response).StatusCode;
        StreamReader reader = new StreamReader(e.Response.GetResponseStream());
        string tramaJson = reader.ReadToEnd();
        DuplicadoException error = js.Deserialize<DuplicadoException>(tramaJson);
        Assert.AreEqual(HttpStatusCode.Conflict, codigo);
        Assert.AreEqual("Actividad duplicada", error.Descripcion);
    }
}
  • ObtenerActividad_encuentraActividad_RetornaActividadConsultada
[TestMethod]
public void ObtenerActividad_encuentraActividad_RetornaActividadConsultada()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8186/Actividades.svc/Actividades/A000001");
    request.Method = "GET";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tramaJson = reader.ReadToEnd();
    JavaScriptSerializer js = new JavaScriptSerializer();
    Actividad actividadObtenido = js.Deserialize<Actividad>(tramaJson);
    Assert.AreEqual("A000001", actividadObtenido.nActividad);
    Assert.AreEqual("12345678", actividadObtenido.cCliente);
    Assert.AreEqual("1234", actividadObtenido.cUsuario);
    Assert.AreEqual("1", actividadObtenido.cTipoActividad);
    Assert.AreEqual("C", actividadObtenido.sEstado);
}
  • ListarActividadPorUsuarioEstado_encuentraActividades_RetornaActividades
[TestMethod]
public void ListarActividadPorUsuarioEstado_encuentraActividades_RetornaActividades()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8186/Actividades.svc/Actividades/12/A");
    request.Method = "GET";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tramaJson = reader.ReadToEnd();
    JavaScriptSerializer js = new JavaScriptSerializer();
    List<Actividad> actividadesObtenidas = js.Deserialize<List<Actividad>>(tramaJson);
    Assert.AreEqual(1, actividadesObtenidas.Count);
}

Finalmente este es el resultado de las pruebas ejecutadas: (Figura 5)

(Figura 5)

Conclusiones:

  • WCF es un marco de trabajo orientado al desarrollo de aplicaciones SOA que encapsula y simplifica el desarrollo de aplicaciones distribuidas basadas en servicios.
  • Las pruebas unitarias son una herramienta que brinda eficacia y agilidad en la realización de pruebas de software.
  • Es necesario mantener la lista de pruebas de unitarias actualizada para aumentar la eficacia de la detección de errores.

Referencias:

Compartelo con tus amigos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *