Well, one of our unit tests is called TestTargetDatabaseSchema and in
that test I do:

@Test
public void verifySchema()
{
  SchemaValidator validator = new SchemaValidator(getConfiguration());
  validator.validate();
}

We also found it useful to actually spit out the DDL that hibernate
would use to generate the schema itself (if you use
hibernate.hbm2ddl.auto=create-drop):

@Test
public void exportSchema()
{
    final SchemaExport export = new SchemaExport(getConfiguration());
    final File outputFile = new File("target/sql/schema.sql");
    outputFile.getParentFile().mkdirs();
    export.setOutputFile(outputFile.getAbsolutePath());
    export.create(false,false);
}

We use maven2, so the target directory is a common location for build
artifacts.  The getConfiguration() method merely sets up the Hibernate
configuration object.  Hope this helps!

On Fri, May 16, 2008 at 9:30 AM, Alexis Willemyns
<[EMAIL PROTECTED]> wrote:
> So, with the solution of "hibernate.hbm2ddl.auto=validate", you don't need
> to write a unit test? If it's the case, the JEUT framework doesn't have any
> sense. I will test this solution!
>
> 2008/5/16, James Carman <[EMAIL PROTECTED]>:
>>
>> This sort of thing should be built into the ORM vendor's
>> implementation.  It is with Hibernate.  If you set
>> hibernate.hbm2ddl.auto=verify, it will make sure the database is set
>> up correctly based on the mapping settings your application specifies.
>>
>> On Fri, May 16, 2008 at 7:22 AM, Alexis Willemyns
>> <[EMAIL PROTECTED]> wrote:
>> > No I don't think it. The goal is not to test the implementation
>> (Hibernate,
>> > Toplink, or another one...) of the JPA specification!
>> >
>> > Imagine the next case. You have a database engineer, who is for example a
>> > Oracle specialist, and you have a backend developper. The db engineer has
>> > the responsability to create manually the the db and the associated
>> tables.
>> > On another side, the backend developper is responsible of the devolpment
>> of
>> > entities (pojos) and he must use the JPA specification. So he will add
>> > annotations like @Entity, @Id, @Column, etc...
>> >
>> > Now the backend developer wants to check that his mapping matches with
>> the
>> > work of the db engineer. For example, if he defined a column 'name', he
>> want
>> > to ensure that there is a column 'name' defined by the db engineer, that
>> the
>> > length is the same, that the unique and nullable factors are the same,
>> and
>> > so on... If he want to do that, he must write a unit test, and in this
>> test,
>> > persist an instance of the entity, and see if there is an error reported
>> by
>> > the JPA implementation. JEUT does the job for you.
>> >
>> > When you said that it will be good that the framework makes sure that the
>> > class has the @Entity annotation, etc,... all these errors will be
>> throwed
>> > by the JPA implementation. The goal is not to have an integration test,
>> or
>> > to test the JPA implementation, but it's to check the synchonization
>> between
>> > the Java pojos (entities) and the physical tables. If the  'name' column
>> is
>> > defined as nullable=false via an JPA annotation, we want to be sure that
>> in
>> > the table defined by the db engineer, the column is defined with
>> null=false.
>> > So for this, in the automated tests of JEUT, an entity with the 'name'
>> field
>> > value set to null is persisted and an exception is expected. If there is
>> > catched exception (throwed by the persistence implementation), the test
>> is a
>> > real success. But if there is no catched exception, it means that the db
>> > engineer didn't define the column with null=false, and the test fails!
>> >
>> > Here is another example. In JPA, you can create date, time and timestamp
>> via
>> > @Temporal annotation. If the backend developer defines a column with
>> > temporal type as date and the db engineer defines the column with time
>> type,
>> > all the information about the day, the month and the year are lost. So
>> JEUT
>> > tests the matching for the dates, and will find the previous error of
>> > mapping.
>> >
>> > JEUT is compatible all db server, the framework will use the
>> > META-INF/persistence.xml defined in the test source folder in the
>> > application of the user. So the user can test with the oracle db, hsqldb,
>> > derby, mysql,...
>> >
>> > It's not easy to explain!
>> >
>> > Is it more clear?
>> >
>> > Alexis
>> >
>> > 2008/5/16, James Carman <[EMAIL PROTECTED]>:
>> >>
>> >> At that point, aren't you just testing that the ORM implementation
>> >> "works"?  Wouldn't it be better to make unit tests that test the
>> >> values of the annotations at runtime?  Stuff like:
>> >>
>> >> 1.  Make sure class X has the @Entity annotation.
>> >> 2.  Make sure its "id" property has the @Id annotation.
>> >> 3.  Make sure the getter for property "foo" has the @Basic annotation
>> >> marking it as required.
>> >> 4.  Make sure the getter for property "foo" has the @Column annotation
>> >> making it saved in the "FOO" column with length 255
>> >>
>> >> If you want to test that the data is actually getting to the database,
>> >> I'd argue that isn't really a unit test, but an "integration test."
>> >> Now to test queries you write, you'd probably want to use something
>> >> like HSQLDB to make sure you're getting back the correct data (load
>> >> some known test data before running tests of course).
>> >>
>> >> On Fri, May 16, 2008 at 6:27 AM, Alexis Willemyns
>> >> <[EMAIL PROTECTED]> wrote:
>> >> > On a technical note, the best solution is to explain you an example.
>> As
>> >> for
>> >> > every layer in an application, unit tests are welcome. This is too
>> true
>> >> for
>> >> > the entities mapped via JPA. So if you want to test an entity, you
>> will
>> >> > create an unit test class (for example with JUnit). In this class, you
>> >> will
>> >> > add some tests. For example, you will write a test that create an
>> >> instance
>> >> > of the entity, set values, persist the entity, retrieve the entity,
>> and
>> >> > check if the retrieved object is exactly the same as the persisted
>> >> entity.
>> >> > It allows you to control that your annotations are matching the
>> >> definition
>> >> > of the real table in the database. You can do extra tests: check the
>> >> > nullable attribute, the length attribute, the unique constraints, and
>> so
>> >> > on... But if you want to test every aspect of your entity, you will
>> write
>> >> a
>> >> > big piece of code for each entity! If you have a model with 10, 20 or
>> >> more
>> >> > entities, you see directly the quantity of work. JEUT is designed to
>> >> > automate for you the testing of an entity. You have just to create a
>> test
>> >> > class that extends a specific JEUT test class and all the work is done
>> >> for
>> >> > you. The framework uses the annotations discovered via reflection API
>> or
>> >> the
>> >> > XML files (orm.xml).
>> >> >
>> >> > Do you understand the goal of JEUT?
>> >> >
>> >> >
>> >> > 2008/5/15, Andrus Adamchik <[EMAIL PROTECTED]>:
>> >> >>
>> >> >> Hi Alexis,
>> >> >>
>> >> >> I think it would really help if you started developing in the open
>> using
>> >> >> one of the free open source sites. This would provide the project
>> >> history to
>> >> >> a potential Champion, including access to the source code and general
>> >> feel
>> >> >> of whether you are really interested in building community around
>> your
>> >> code.
>> >> >>
>> >> >> On a technical note, what exactly does this framework test? Is this
>> >> >> regression testing (i.e. checking that the ORM schema matches the
>> actual
>> >> DB
>> >> >> schema), or is there a value beyond that? We had a similar framework
>> >> >> submitted to the Cayenne project some time back, and I could never
>> >> >> understand what exactly is being tested.
>> >> >>
>> >> >> Andrus
>> >> >>
>> >> >>
>> >> >> On May 15, 2008, at 9:57 AM, Alexis Willemyns wrote:
>> >> >>
>> >> >>> Hello all,
>> >> >>>
>> >> >>> I was a little bit hesitant before posting this project proposition.
>> >> But
>> >> >>> let's go! I hope that this attempt will be a success.
>> >> >>>
>> >> >>> JEUT stands for "JPA Entity Unit Test" and is currently in
>> development.
>> >> So
>> >> >>> there is no public website and the code is ended up to 70%. JEUT is
>> a
>> >> >>> testing framework for JPA entities and its main goal is to automate
>> the
>> >> >>> test
>> >> >>> of entities without the need to write long and boring home tests.
>> >> >>>
>> >> >>> The mission is to provide a framework which is able to test the
>> >> matching
>> >> >>> between entities using annotations and/or xml descriptors and the
>> real
>> >> >>> database. A framework 100% compliant with all the existing
>> annotations
>> >> in
>> >> >>> JPA, for the current version 1 (and the future version 2... in the
>> >> >>> future).
>> >> >>>
>> >> >>> JEUT analyzes all the annotations and creates instances of entites
>> with
>> >> >>> random values. It tries to persist these instances via the entity
>> >> manager
>> >> >>> and reports the problems if existing. JEUT can be used as an
>> extension
>> >> of
>> >> >>> JUnit or TestNG, or maybe all others test frameworks.
>> >> >>>
>> >> >>> For the moment, the team is only composed with me, and I have
>> discussed
>> >> >>> with
>> >> >>> my self about what is means to become an Apacha project. I am aware
>> >> what
>> >> >>> are
>> >> >>> the conditions, responsabilities and impacts to become an Apache
>> >> project.
>> >> >>> I
>> >> >>> am looking a Champion to go in the proposal phase (if the proposal
>> >> makes
>> >> >>> sense) and to build a community around JEUT.
>> >> >>>
>> >> >>> Thank you for any feedback and recommendations (and sorry for my
>> >> english
>> >> >>> coming from Belgium).
>> >> >>>
>> >> >>> I look forward to your responses.
>> >> >>>
>> >> >>> Regards,
>> >> >>>
>> >> >>> Alexis Willemyns
>> >> >>> JEUT project founder
>> >> >>>
>> >> >>
>> >> >>
>> >> >> ---------------------------------------------------------------------
>> >> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >> >>
>> >> >>
>> >> >
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >>
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to