NHProfAlive! It is alive!
I just finished writing the final test for the basic functionality that I want for NHibernate Profiler:
[Test]
public void SelectBlogById()
{
ExecuteScenarioInDifferentProcess<SelectBlogByIdUsingCriteria>();
StatementModel selectBlogById = observer.Model.Sessions.First()
.Statements.First();
const string expected = @"SELECT this_.Id as Id3_0_,
this_.Title as Title3_0_,
this_.Subtitle as Subtitle3_0_,
this_.AllowsComments as AllowsCo4_3_0_,
this_.CreatedAt as CreatedAt3_0_
FROM Blogs this_
WHERE this_.Id = @p0
";
Assert.AreEqual(expected, selectBlogById.Text);
}
I actually had to invest some thought about the architecture of testing this. This little test has a whole set of ideas behind it, about which I'll talk about at a later date. Suffice to say that this test creates a new process, start to listen to interesting things that are going on there (populating the observer model with data).
Another interesting tidbit is that the output is formatted for readability. By default, NHiberante's SQL output looks something like this:
SELECT this_.Id as Id3_0_, this_.Title as Title3_0_, this_.Subtitle as Subtitle3_0_, this_.AllowsComments as AllowsCo4_3_0_, this_.CreatedAt as CreatedAt3_0_ FROM Blogs this_ WHERE this_.Id = @p0
This is pretty hard to read the moment that you have any sort of complex conditions.
More posts in "NHProf" series:
- (02 Dec 2008) What is the role of the DBA?
- (01 Dec 2008) The stack is not as simple as you wish it to be
- (21 Oct 2008) Logging interception
- (13 Oct 2008) Another milestone
- (13 Oct 2008) Alive! It is alive!
Comments
Would you consider the test to be overspecified since formatting changes would break this test which tests functionality?
Not even formatting changes. This test will fail on Mono/Linux unless the code is compiled because all of those newlines are \r\n and Linux would be \n. Trust me - that was one of the most difficult challenges we faced with getting NUnit running. System.Environment.NewLine is your friend:
www.cornetdesign.com/.../...nvironmentnewline.html
Maybe it's time to introduce WhitespaceIgnoringStringComparer ? To NUnit, not Ayende's tool.
Is the code available anywhere?
Ken,
This is going to be commercial, so I don't think so
I was thinking more along the lines of Query.HasColumns(new string[] { "Column1", "Column1").IsForTable("SomeTable"), etc.
pb,
Can you explain more? I don't think that I follow you
Instead of checking the SQL string, check what the SQL string is based on so it isn't dependent on formatting changes, those auto generated aliases, etc., Maybe something like:
Assert.IsTrue(selectBlogById.HasTablesExact(new string[] {
}));
Assert.IsTrue(selectBlogById.HasColumnsExact(new string[] {
}));
Comment preview