Quiero crear una unidad de pruebas que cubren el código que uso de base de datos relacional en Juego en el marco de la 2.1.0. Hay muchas posibilidades para este y todos causan problemas:

De pruebas en la memoria de la base de datos H2

Play framework documentación propone ejecutar pruebas unitarias en H2 base de datos en memoria, incluso si la principal base de datos utilizada para el desarrollo y la producción de utilizar otro software (es decir, MySQL):

app = Helpers.fakeApplication(Helpers.inMemoryDatabase());

Mi aplicación no utiliza complicado RDBMS características tales como procedimientos almacenados y más acceso a bases de datos de los casos son ebean llamadas, por lo que debe ser compatible con MySQL y H2.

Sin embargo, la creación de la tabla declaraciones en las evoluciones de usar MySQL-características específicas, tales como la especificación de ENGINE = InnoDB, DEFAULT CHARACTER SET = utf8, etc. Me temo que si voy a quitar estos componentes propiedad de CREATE TABLE, MySQL va a utilizar algún valor por defecto que no puedo controlar, y que dependen de la versión, por lo que para probar y desarrollar principal de la aplicación de configuración de MySQL debe ser modificada.

Nadie utiliza este enfoque (haciendo evoluciones compatible con MySQL y H2)?

Otras ideas de cómo pueden ser manipulados:

  • Separado evoluciones para MySQL y H2 (no es una buena idea)
  • Alguna manera para hacer H2 ignorar adicionales MySQL cosas en create table (MySQL modo de compatibilidad no funcionan, todavía se quejan, incluso en default character set). No sé cómo.

Pruebas en el mismo controlador de base de datos como base de datos principal

La única ventaja de H2 base de datos en memoria que es rápido, y las pruebas en el mismo controlador de base de datos que dev/base de datos de producción puede ser mejor, porque es más cerca del entorno real.

Cómo puede ser hecho a la derecha en Juego en el marco?

Intentado:

Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);

Parece evoluciones trabajar aquí, pero ¿es mejor limpiar la base de datos antes de cada prueba? Mediante la creación de código personalizado que trunca cada mesa? Si va a colocar tablas, luego se evoluciones ejecutar de nuevo antes de la siguiente prueba, o que se aplican una vez por play test comando? O una vez por Helpers.fakeApplication() invocación?

¿Cuáles son las mejores prácticas aquí? Escuchado acerca de dbunit, es posible integrar sin mucho dolor y peculiaridades?

  • ¿A llegar a ninguna parte con esto?
InformationsquelleAutor kolen | 2013-02-07

5 Comentarios

  1. 8

    Primer lugar, le recomiendo que utilice el mismo motor de base de datos de pruebas y producción, ya que podría evitar algunos difíciles de encontrar errores.

    Acerca de la necesidad de limpiar su base de datos entre cada prueba, puede utilizar Ebean DdlGenerator para generar secuencias de comandos para crear una base de datos limpia y JUnit del @Before anotación para ejecutar automáticamente estas secuencias de comandos antes de cada prueba.

    El uso de la DdlGenerator se puede hacer de la siguiente manera :

        EbeanServer server = Ebean.getServer(serverName);
        ServerConfig config = new ServerConfig();
        DdlGenerator ddl = new DdlGenerator((SpiEbeanServer) server, new MySqlPlatform(), config);
    

    Este código puede ser colocado en una clase de base que se podía hacer a heredar sus pruebas (o en el interior de una costumbre Runner que puede utilizar con el @RunWith anotación).

    También permite automatizar fácilmente la FakeApplication creación, evitando algunas código repetitivo.

    Algunos enlaces que pueden ser útiles :

    • Do el código el uso de la misma base de datos principal de la aplicación de base de datos para la ejecución de las pruebas, o hay algo en application.conf hacer las pruebas de forma automática el uso de base de datos independiente?
    • Podría usted por favor, consulte esta pregunta? stackoverflow.com/questions/20623040/…
    • He respondido a tu pregunta.
    • puedo usar bases de datos en un juego real marco del proyecto? Porque he oído que 2.0 no admite la excepción de H2.
  2. 5

    He utilizado el mismo motor de base de datos base de datos principal y dbunit para la limpieza antes de cada prueba.

    public class SomeTest {
        //...
    
        @Before
        public void startApp() throws Exception {
            //Set up connection to test database, different from main database. Config better should be used instead of hard-coding.
            Map<String, String> settings = new HashMap<String, String>();
            settings.put("db.default.url", "jdbc:mysql://localhost/somedatabase?characterEncoding=UTF-8&useOldAliasMetadataBehavior=true");
            settings.put("db.default.user", "root");
            settings.put("db.default.password", "root");
            settings.put("db.default.jndiName", "DefaultDS"); //make connection available to dbunit through JNDI
            app = Helpers.fakeApplication(settings);
            Helpers.start(app);
    
            databaseTester = new JndiDatabaseTester("DefaultDS");
    
            IDataSet initialDataSet = new FlatXmlDataSetBuilder().build(play.Play.application()
                    .resourceAsStream("/resources/dataset.xml"));
            databaseTester.setDataSet(initialDataSet);
            databaseTester.onSetup();
        }
    
        @After
        public void stopApp() throws Exception {
            databaseTester.onTearDown();
            Helpers.stop(app);
        }
    }

    Mi dataset.xml sólo contienen los nombres de tabla para decirle dbunit para vaciar estas tablas antes de cada prueba. También puede contener accesorios.

    <?xml version="1.0" encoding="UTF-8"?>
    <dataset>
      <name_of_my_first_table />
      <name_of_my_second_table />
    </dataset>

    Evoluciones que se ejecute automáticamente en la base de datos de prueba cuando se utiliza este enfoque, por lo que si usted eliminar todas las tablas de la base de datos de prueba, que será recreado.

    Es excesiva para el uso de dbunit si sólo necesita para limpiar las tablas, se puede limpiar mediante la emisión de consulta directamente o mediante el uso de ebean DdlGenerator. Pero yo también uso dbunit para la comparación de los datos.

    Yo no uso Helpers.running, porque toma Runnable y Runnable implementaciones no puede lanzar excepciones – muy incómodo para las pruebas. Pero si miramos el código para running(), llama a Helpers.start() y Helpers.stop() por eso yo llamo a estos métodos directamente en @Before y @After.

    Decidió no utilizar H2 para la ejecución de pruebas: sí, va más rápido, pero hay demasiada diferencia entre ella y MySQL.

  3. 1

    Cuando escribí mis pruebas para mi base de datos postgres, simplemente los he creado un HashMap para conectarse a la base de datos y, a continuación, escribí consultas de prueba para asegurarse de la correcta cantidad de registros que existe y así sucesivamente… Aquí está mi código.

        @Test
    public void testDataBase() {
        final HashMap<String,String> postgres = new HashMap<String, String>();
        postgres.put("db.default.driver","org.postgresql.Driver");
        postgres.put("db.default.url","jdbc:postgresql://localhost/myDataBase");
        postgres.put("db.default.user", "postgres");
        postgres.put("db.default.password", "password");
    
        running(fakeApplication(postgres), new Runnable() {
    
            @Override
            public void run() {
    
                //Insert Assertions Here
            }
        });
    }
    
  4. 1

    También puede utilizar DB simulacro, si el objetivo es validar su Slick|JPA|Anorm asignaciones & funciones basadas en.

    Cuando está en forma es tiene la ventaja de ser más compatible con la unidad de pruebas que una prueba DB, y más fácil de manejar (no el programa de instalación/clara de tareas, no de sincronización de pruebas para evitar el acceso a las mismas tablas de prueba).

    Usted puede tener una mirada en mis marco Acólito ( http://github.com/cchantep/acolyte ) que se utiliza en las especificaciones de Anorm sí mismo (por ejemplo,https://github.com/playframework/playframework/blob/master/framework/src/anorm/src/test/scala/anorm/SqlResultSpec.scala ).

Dejar respuesta

Please enter your comment!
Please enter your name here