Kristian Waagan wrote:

So far most of the comments I have received have been regarding implementation, which was not my primary goal. Do we all agree what we need, but we want to do it in different ways? Or are there still someone out there that have more fundamental issues to comment on?

I agree with Andreas: have a base generic class and a base class for JDBC



   /**
    * Get a connection to some database.
    * If the database does not exist, it will be created.
    * As long as the state of this class is not changed, this method will
* return a connection to the same database. Most suites will require that
    * this condition is true.
    */

My "as long as state of this class is not changed" was supposed to indicate that a connection to the same database was returned. "some" was chosen because a test should not generally care what the database it uses is named - as long as it is the same database for a given time (typically while running a single test method or a suite). This is a matter of wording.

OK. It's just not clear to me what "some database" is, and it took some work for me to track it down.

- You should document what the defaults are, such as "wombat" for the database name and "APP" for username and password.


I did not do this, because most tests should not care.

Why do you say that? I'd like to know what's happening by default before I use the default behavior of an API.


- why can't setup() or teardown() automaticlly call resetState() rather than asking the user to do it? This seems dangerous and highly error-prone.


When I wrote the class, I was looking at the JDBC4 test suite. It is configured to always run under DerbyNetClient, but it "internally" runs tests for embedded as well. BasicDerbyJUnitTest was written with the following paradigm in mind: do setup (basically set framework, maybe change default name and force use of datasource), then use getConnection() for all tests in suite. The setup would be done in a TestSetup decorator. With this approach, the test code can be exactly the same for multiple frameworks and/or setups, where as the test decorator would do different things for each suite. Calling resetState in TestCase.setUp() would delete the state setup by TestDecorator.setUp(). If this way to run tests are not needed, things can be rewritten (in many ways...).


OK, thanks for clarifying. It would be good to provide this discussion in the Javadoc so users know why they have to jump through this particular hoop. It also explains better the intent for this class.

By the way, wouldn't separating configuration out from the base class make this management of state go away? You can pass in a non-default configuration object and a non-default JDBCClient if you want to use non-default behavior.


- I don't understand why you set a property for the database name before calling obtainConnection() rather than just passing in the database name to obtainConnection(). It would be good to at least explain the motivation behind this, as at first read it seems a bit odd. Scanning at the code, it looks like you use db(P_DBNAME) in createBaseDatabaseUrl() where you could just as easily pass the database name in as a parameter


All properties can be hardcoded and represented by constants instead of using a Properties object. I just wanted to signal that results are based on the state of the class, and that P_* are not set by environment properties, but that S_* are (passed on from the test harness). Andreas' TestConfiguration would separate this information from the class, which is good. I do think it is a bit too rigid as it is to give the required flexibility (not possible to change anything), but this is of course easily changed. It also give me the impression that every configurable aspect is passed on from the test harness, which is not yet true.

Again, I think this whole thing goes away if you use the TestConfiguratio model. Right?


- You have a lot of useful debug statements, but your javadoc doesn't really explain how to turn debug on and off, nor is it clear from the class (e.g. there is not "debug(boolean)" method).


Would mentioning this in the public class documentation do the trick?

Yes, that would help.

- It would be nice to have a helper method that allows subclasses to quickly obtain other properties set by the harness (e.g. so they don't have to do a privileged block every time they want to get a system property)


Are you thinking of a getSystemProperty(key) with a privileged block, or a method accessing a "cached" system properties object?

The former if system properties are not read-only, otherwise the latter is fine with me. Since accessing system properties directly requires jumping through security hoops, I thought it would be good to isolate it.

Also, it would be very good to abstract out configuration implementation details so that if we change the way tests are configured all the tests don't have to change. Another motivation for the TestConfiguration class...


- I like Andreas' typesafe JDBCClient class, it seems a better approach.


Yes. It should be extended to have information about DataSource classes also, or else it would not be sufficent in a JSR 169 (like) environment. Some complications here if we want to allow for more than one type of DataSource for a given framework (XA, Pooled, Simple, "normal").

OK

begin:vcard
fn:David W Van Couvering
n:Van Couvering;David W
org:Sun Microsystems, Inc.;Database Technology Group
email;internet:[EMAIL PROTECTED]
title:Senior Staff Software Engineer
tel;work:510-550-6819
tel;cell:510-684-7281
x-mozilla-html:TRUE
version:2.1
end:vcard

Reply via email to