Pregunta

Esta pregunta acerca de las pruebas unitarias provocó otra cosa que me ha estado molestando. He ido hacia atrás y hacia delante en tres maneras de hacer las pruebas unitarias al golpear una base de datos.

  1. Crear objetos simulados y enchufarlos. Esto tiene la ventaja de no necesitar una base de datos, pero es mucho tiempo y no estoy seguro de cuánto retorno de la inversión que estoy recibiendo. He estado recibiendo en COI y MOq un poco, pero todavía parece doloroso.
  2. Crea un montaje y desmontaje scripts de base para crear los casos conocidos, y la prueba para aquellos. Una vez más, puede llevar mucho tiempo, pero aún más fácil de crear que los objetos simulacro mayor parte del tiempo. Y otras personas en el trabajo todavía puede ejecutarlo asumiendo que tienen servidor SQL en su localhost.
  3. comprobar manualmente la base de datos dev y modificar las pruebas unitarias. Intensivamente el trabajo manual, pero si tengo un "equipo de prueba" que no cambia, parece que funciona bien. En mi máquina, al menos :-).

Sé que la opción 1 es la manera "correcta" de hacer las pruebas unitarias, pero de los tres, eso es probablemente la opción que yo he utilizado el menor (aunque los últimos proyectos han sido con la COI, de manera que la puerta está abierta para mí ). Me di cuenta de una gran cantidad de ella depende de lo que exactamente está siendo burlado y lo que está siendo probado, pero lo que me estoy perdiendo aquí?

Si el contexto ayuda, estoy en una tienda de # C, escribiendo aplicaciones internas, sólo unos pocos desarrolladores.

¿Fue útil?

Solución

La primera no debería ser tan difícil si usted tiene una capa de acceso de datos que expone sólo un puñado de métodos IQueryable<T>. Hay un truco agradable puede utilizar para datos falsos: simplemente almacenar los objetos de entidad en un List<T> y el uso AsQueryable. Me parece más fácil que MOQ para las partes de datos.

En cuanto COI, tomo la posición que ha usado en exceso en la actualidad (ser consciente de que mi opinión representa la minoría de los programadores en este sentido). Puede utilizar una herramienta como Moles durante las pruebas para maqueta sin tener que abuso el diseño de su programa. No consumo COI a menos que el diseño requiere en realidad para él.

Otros consejos

Sin duda alguna lo seguirá utilizando pruebas unitarias verdaderos (opción 1). Me gusta el consejo de Stephen para esto.

También es posible encontrar pruebas de integración con una base de datos real (opción 2) necesaria para utilizar también (opción 2). ¿Por qué? Debido a que parte de lo que necesita para prueba (O / mapeo R, compatibilidad con el esquema actual DB, etc.) no están cubiertos por las pruebas de unidad verdaderos.

Como para la configuración y la lógica de desmontaje, que heredan de este suele ser suficiente (usando .NET, NUnit, y SqlServer para la base de datos):

using System.Transactions;
using NUnit.Framework;
namespace Crown.Util.TestUtil
{
    [TestFixture]
    public class PersistenceTestFixture
    {
        public TransactionScope TxScope { get; private set; }

        [SetUp]
        public void SetUp()
        {
            TxScope = new TransactionScope();
        }

        [TearDown]
        public void TearDown()
        {
            if (TxScope != null)
            {
                TxScope.Dispose();
                TxScope = null;
            }
        }
    }
}

Tan fácil como pastel.

Hay toda una serie de respuesta a esto. Lo primero que debe hacer es articular claramente lo que está probando. Es la fachada de una API que tiene una base de datos detrás de ella, los objetos DAO, la estructura de su base de datos?

Para llegar a esto también le ayudará a decidir la mejor manera de probar cosas. También hay por lo que puedo ver una alternativa a los que usted lista. Esto es para poner en marcha en la base de datos de memoria como hsql y ejecutar sus clases y las pruebas en contra. Esto significa que puede crear la estructura de base de datos al inicio de ustedes pruebas. Porque está en la memoria no tiene que preocuparse de tener un servidor de base de datos, es rápido, y se puede cargar con datos específicos de la prueba.

Yo uso se burla un poco y mientras que son grandes para la unidad de prueba de una clase, en algunos casos no lo son. También se puede perder conducir con bastante facilidad. No es raro que algo que funciona con burla, que no funcionan cuando se integra. El reasonnfor esto es que va a cargar la maqueta con ciertas expectativas y respuestas, que es posible que haya intepreted indebidamente de lo que representa la maqueta.

No me malinterpreten, me gusta burla y los usan bastante. Pero, al hacerlo, nunca se debe asumir que porque algo es a prueba la unidad, que es correcta. Lo hace aumenta las posibilidades, pero en la integración pruebas en realidad le da la garantía de 100%.

¿Qué estás poniendo a prueba realmente que te hace sentir que esto es difícil?

Si desacoplar su lógica de la capa de negocios y servicio de su código de persistencia, debe easilly ser capaz de aislar el código que desee unidad de prueba sin tener que una base de datos.

Uno de los principios más importantes de la unidad de pruebas es disociar y la prueba de forma aislada. Cuando se tiene una comprensión clara de cómo hacerlo, la unidad de pruebas es fácil. Cuando no lo hace, la unidad de pruebas se hace duro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top