Ayende @ Rahien

Hi!
My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:

ayende@ayende.com

+972 52-548-6969

, @ Q c

Posts: 5,968 | Comments: 44,484

filter by tags archive

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:

  1. (02 Dec 2008) What is the role of the DBA?
  2. (01 Dec 2008) The stack is not as simple as you wish it to be
  3. (21 Oct 2008) Logging interception
  4. (13 Oct 2008) Another milestone
  5. (13 Oct 2008) Alive! It is alive!

Comments

pb
pb

Would you consider the test to be overspecified since formatting changes would break this test which tests functionality?

Cory Foy

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

Krzysztof Koźmic

Maybe it's time to introduce WhitespaceIgnoringStringComparer ? To NUnit, not Ayende's tool.

Ken Egozi

Is the code available anywhere?

Ayende Rahien

Ken,

This is going to be commercial, so I don't think so

pb
pb

I was thinking more along the lines of Query.HasColumns(new string[] { "Column1", "Column1").IsForTable("SomeTable"), etc.

Ayende Rahien

pb,

Can you explain more? I don't think that I follow you

pb
pb

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[] {

"Blogs"

}));

Assert.IsTrue(selectBlogById.HasColumnsExact(new string[] {

"Id",

"Title",

"Subtitle",

"AllowsComments",

"CreatedAt"

}));

Comment preview

Comments have been closed on this topic.

FUTURE POSTS

  1. Pointer arithmetic and dynamic HTML generation FTW–at 2 AM - 8 hours from now

There are posts all the way to Jul 28, 2015

RECENT SERIES

  1. Career planning (6):
    24 Jul 2015 - The immortal choices aren't
  2. Production postmortem (4):
    23 Jul 2015 - The case of the native memory leak
  3. API Design (7):
    20 Jul 2015 - We’ll let the users sort it out
  4. What is new in RavenDB 3.5 (3):
    15 Jul 2015 - Exploring data in the dark
  5. The RavenDB Comic Strip (3):
    28 May 2015 - Part III – High availability & sleeping soundly
View all series

Syndication

Main feed Feed Stats
Comments feed   Comments Feed Stats