2009-01-06 17 views
10

Estoy creando una aplicación que consulta un servicio web. Los datos en la base de datos varían y cambian con el tiempo. ¿Cómo construyo una prueba unitaria para este tipo de aplicación?¿Cómo se hace una prueba unitaria cuando los resultados varían?

El servicio web devuelve xml o una página html sin resultados de búsqueda. Realmente no puedo cambiar el servicio web. Mi aplicación básicamente consulta el servicio web usando HTTPURLConnection y obtiene la respuesta como una Cadena.

Espero que ayude con más detalle.

Respuesta

26

Resuma el servicio web utilizando un proxy que puede simular. Haga que su servicio web simulado devuelva varios valores que representan datos normales y casos de esquina. También simule obtener excepciones del servicio web. Asegúrese de que el código funcione en estas condiciones y puede estar razonablemente seguro de que funcionará con los valores que el servicio web proporciona.

Mire jMock para la burla de Java.

+0

1: objetos Mock despejar cualquier duda acerca de las interfaces. –

+0

ni siquiera pienso en burla el servicio web. Eso suena como la ruta a seguir. – kevindaub

3

Parece que su prueba es demasiado alta. Considere burlarse de la interfaz del servicio web y escribir otras pruebas unitarias en la capa de datos que accede a la base de datos. Algunos detalles más aquí pueden hacer que esta pregunta sea más fácil de responder, por ejemplo, la situación que intentas probar.

que normalmente se esperaría los resultados de una prueba de unidad no cambian, o al menos estar dentro de un rango que se está esperando

3

Su pregunta es un poco de composición abierta, pero definitivamente hay algunas opciones comprobables simplemente usando la información anterior:

  1. Puede comprobar si la consulta funciona en absoluto. Afirme que debe recuperar un conjunto de resultados no vacío/no nulo.
  2. Puede comprobar si los resultados de la consulta son conjunto de resultados válido. Afirme que los resultados deben pasar su código de validación (por lo tanto, en este punto, usted sabe que los datos no son nulos, no son sensuales y posiblemente útiles).
  3. Si conoce algo sobre el esquema de datos/la descripción de los datos, puede afirmar que los campos son sensatos entre sí. Por ejemplo, si obtiene un resultado con un helicóptero, no debería asociarse con una altitud de 100 metros negativos ....
  4. Si sabe algo acerca de la distribución probabilística de los datos, debe poder recopilar un conjunto de datos y afirmar que la distribución resultante está dentro de una desviación estándar de lo que esperaría ver.

Estoy seguro de que con algo más de información, obtendrá un montón de sugerencias útiles.

6

Estrictamente hablando de pruebas unitarias, solo puede probar unidades que tienen un comportamiento determinista .

Una prueba que se conecta a un servidor web externo es una prueba de integración .

La solución es burlarse de la HTTPURLConnection, es decir, crear una clase en las pruebas de su unidad que derive de la clase HTTPURLConnection y que devuelva un valor codificado o un valor parametrizable. EDIT: tenga en cuenta que esto se puede hacer maunally, sin ningún marco de burla.

La clase que consulta el servidor web no se instanciate la HttpURLConnection, pero recibirla a través de un parámetro. En las pruebas de unidad, se crea el HTTPURLConnectionMock, y lo pasa a la clase que interroga al servidor web que lo utilizará, ya que utiliza una HttpURLConnection real. En el código de producción, crea una HTTPURLConnection real y la pasa a la clase.

También puede hacer que su HTTPURLConnectionMock pueda lanzar una IOException, a condiciones de error de prueba. Simplemente tenga un método para decirle que no devuelva el resultado, sino una excepción en la próxima solicitud.

+0

Gracias por una respuesta aún más completa. – kevindaub

1

Un problema que he encontrado es con enrevesado (que significa "mierda") datamodels, donde no se puede nunca estar seguro de que los problemas se deben a errores de código o errores en los datos.

Un síntoma de esto es cuando su aplicación funciona muy bien, pasa todas las pruebas, etc. con datos falsos o un nuevo conjunto de datos, pero se rompe horriblemente cuando ejecuta su aplicación en datos reales.

+0

Muy cierto. Supongo que es por eso que necesita más de 1 tipo de verificación: pruebas unitarias y pruebas de integración. – kevindaub

Cuestiones relacionadas