¿Cómo maneja los datos ficticios utilizados para las pruebas? Mantenerlos con sus respectivas entidades? En un proyecto de prueba por separado? Cargarlos con un serializador de recursos externos? ¿O simplemente recrearlos donde sea necesario?Estrategias ficticias de prueba de datos y unidades en una pila de aplicaciones modulares
Tenemos una pila de aplicaciones con varios módulos que dependen de otra y cada una contiene entidades. Cada módulo tiene sus propias pruebas y necesita datos ficticios para ejecutar.
Ahora un módulo que tiene muchas dependencias necesitará una gran cantidad de datos ficticios de los otros módulos. Sin embargo, aquellos no publican sus objetos ficticios porque son parte de los recursos de prueba, por lo que todos los módulos tienen que configurar todos los objetos ficticios que necesiten una y otra vez.
también: la mayoría de los campos en nuestras entidades no están nullable por lo que incluso las transacciones que se ejecutan contra la capa de objetos les obliga a contener algún valor, la mayor parte del tiempo con más limitaciones como singularidad, longitud, etc.
¿Existe una la mejor forma de salir de esto o todos los compromisos de soluciones?
Más Detalle
Nuestra pila es como la siguiente:
un módulo:
src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Utilizamos Maven para manejar dependencias. ejemplo
módulo:
- Módulo A tiene algunos objetos ficticios
- Módulo B necesita sus propios objetos y el mismo que el Módulo A
Opción A)
Un módulo de prueba T puede contener todos los objetos ficticios y proporcionarlos en un ámbito de prueba (para que las dependencias cargadas no sean jared) a todas las pruebas en todos los módulos. ¿Eso funcionará? Significado: Si se me carga T en Un y corro instalar en Un será que no contiene referencias introducidas por T sobre todo no B? Luego, sin embargo, A sabrá sobre B's datamodel.
Opción b)
Módulo A proporciona los objetos ficticios en algún lugar de src/main/java../entities/dummy
permitiendo B para conseguirlos, mientras Un no sabe nada de datos ficticios B 's
Opción c)
Cada módulo contiene recursos externos que son objetos ficticios serializados. Pueden ser deserializados por el entorno de prueba que los necesita porque tiene la dependencia del módulo al que pertenecen. Sin embargo, esto requerirá que cada módulo cree y serialice sus objetos ficticios y ¿cómo lo haría? Si con otra prueba unitaria introduce dependencias entre pruebas unitarias que nunca deberían ocurrir o con un script, será difícil de depurar y no será flexible.
Opción d)
usen una estructura simulada y asignar manualmente los campos requeridos para cada prueba según sea necesario. El problema aquí es que la mayoría de los campos en nuestras entidades no aceptan nulos y, por lo tanto, requerirán que se llamen a los instaladores o constructores, lo que nos haría volver a empezar desde el principio.
Lo que no queremos
No queremos configurar una base de datos estática con datos estáticos como la estructura de los objetos requeridos cambiará constantemente. Mucho en este momento, un poco más tarde. Por lo tanto, queremos que hibernate configure todas las tablas y columnas y las complete con datos en el tiempo de prueba de la unidad. Además, una base de datos estática introduciría muchos errores potenciales e interdependencias de prueba.
¿Mis pensamientos van en la dirección correcta? ¿Cuál es la mejor práctica para hacer frente a las pruebas que requieren una gran cantidad de datos? Tendremos varios módulos interdependientes que requerirán objetos llenos con algún tipo de datos de varios otros módulos.
EDITAR
Algunos más información sobre cómo lo estamos haciendo ahora mismo en respuesta a la segunda respuesta:
Así, por simplicidad, tenemos tres módulos: Person
, Product
, Order
. Person
pondrá a prueba algunos métodos Manager utilizando un objeto MockPerson
:
(en persona/src/test/java :)
public class MockPerson {
public Person mockPerson(parameters...) {
return mockedPerson;
}
}
public class TestPerson() {
@Inject
private MockPerson mockPerson;
public testCreate() {
Person person = mockPerson.mockPerson(...);
// Asserts...
}
}
no será empaquetado La clase MockPerson
.
Lo mismo se aplica para los ensayos sobre el producto:
(en producto/src/test/java :) se necesita
public class MockProduct() { ... }
public class TestProduct {
@Inject
private MockProduct mockProduct;
// ...
}
MockProduct
pero no serán empaquetados.
Ahora las Pruebas Solicitar requerirá MockPerson
y MockProduct
, por lo que ahora necesitan actualmente para crear ambos, así como para poner a prueba MockOrder
Order
.
(en orden /src/test/java :)
Estos son duplicados y tendrá que ser cambiado cada vez que cambia Person
o Product
public class MockProduct() { ... }
public class MockPerson() { ... }
Ésta es la única clase que debería estar aquí:
public class MockOrder() { ... }
public class TestOrder() {
@Inject
private order.MockPerson mockPerson;
@Inject
private order.MockProduct mockProduct;
@Inject
private order.MockOrder mockOrder;
public testCreate() {
Order order = mockOrder.mockOrder(mockPerson.mockPerson(), mockProduct.mockProduct());
// Asserts...
}
}
El probl es decir, que ahora tenemos que actualizar person.MockPerson
y order.MockPerson
siempre que se cambie Person
.
¿No es mejor simplemente publicar los Mocks con el contenedor para que cualquier otra prueba que tenga la dependencia de todos modos pueda simplemente llamar a Mock.mock y obtener un objeto de configuración agradable? ¿O es este el lado oscuro, el camino fácil?
¡Hola cwash! Gracias por el puntero de fábrica. Recuerdo usar eso en un tutorial de rieles;) Esta podría ser la solución, tendré que verificarlo más. – Pete
@Pete - Genial, ¿puedes dejarnos una nota/actualización para decirnos qué has decidido? – cwash
Por lo tanto, parece que podemos usarlo como un proveedor de datos falsos central. Al final, sin embargo, es solo la Opción a) lo que significa que algún proyecto externo contendrá todos los generadores de datos requeridos. Todavía me pregunto si esa es la mejor manera de hacerlo. Esperando obtener más opiniones sobre esto ... – Pete