<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0AERHk-cSp7ImA9WhRbEUQ.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856</id><updated>2012-02-02T16:15:05.759+01:00</updated><category term="PartCover" /><category term="Course" /><category term="MVC" /><category term="SQL2008" /><category term="CSD" /><category term="EntityFramework" /><category term="Progressive .NET Tutorials" /><category term="SpecFlow" /><category term="SpecRun" /><category term="Build" /><category term=".NET Framework" /><category term="Skills Matter" /><category term="Security" /><category term="Oracle" /><category term="IIS" /><category term="Visual Studio 2010" /><category term="DevCamp" /><category term="ASP.NET" /><category term="Windows Phone 7" /><category term="Visual Studio 2008" /><category term="PDC2008" /><category term="TDD" /><category term="WCF" /><category term="TeamCity" /><category term="BDD" /><category term="PDC" /><category term="Tools" /><category term="SpecLog" /><category term="developer" /><category term="Gherkin" /><category term="WPF" /><category term="Unit Testing" /><category term="Windows 7" /><title>Gáspár Nagy's Blog</title><subtitle type="html">&lt;i&gt;Everybody is an idiot, me the only one being a helicopter.&lt;/i&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.gasparnagy.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><feedburner:info uri="gasparnagy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://gasparnagy.blogspot.com/feeds/posts/default" /><feedburner:emailServiceId>gasparnagy</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://gasparnagy.blogspot.com/feeds/posts/default" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fgasparnagy.blogspot.com%2Ffeeds%2Fposts%2Fdefault" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><entry gd:etag="W/&quot;CE8CQn4zcSp7ImA9WhdaFk4.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-199155459955408443</id><published>2011-10-26T14:41:00.001+02:00</published><updated>2011-10-26T14:41:03.089+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T14:41:03.089+02:00</app:edited><title>SpecFlow 1.8</title><content type="html">&lt;p&gt;We have released &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; v1.8 recently (just published 1.8.1 with a few fixes) and I would like to take the opportunity to give a subjective summary of the new features and also some outlook for the upcoming releases.&lt;/p&gt;  &lt;h5&gt;Run &amp;amp; debug scenarios from context menu in VS2010&lt;/h5&gt;  &lt;p&gt;Maybe the most interesting (most wanted) feature is to make scenario execution more convenient. Now it is here: in the context menu of the editor, the project, folder or file nodes of the solution explorer, you will find new commands to run or debug the scenarios of the current context: the scenario of the cursor position (or all from the file if you stand in the header or between scenarios) or the scenarios in the files matching to the selected solution explorer node.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-lfoEzpVeTfU/Tqf_uj46iqI/AAAAAAAAEWc/8Dv4_aOAjAk/s1600-h/image%25255B16%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-p_Qhlhed8Ts/Tqf_wO0ozrI/AAAAAAAAEWk/Qdg4OH7jgC4/image_thumb%25255B12%25255D.png?imgmax=800" width="442" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Since SpecFlow does not run the scenarios directly, but you run them with a unit test runner, this feature is a little bit tricky and needs a short explanation.&lt;/p&gt;  &lt;p&gt;When you select the “Run SpecFlow Scenarios” command, SpecFlow tries to run the selected scenarios with your &lt;em&gt;favorite&lt;/em&gt; unit test runner. You can either tell SpecFlow which one is your favorite or let it find out automatically based on some built-in ranking. This can be done in the SpecFlow section of the Visual Studio Tools/Options dialog.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-u-h7-8rbbrM/Tqf_wkTVbrI/AAAAAAAAEWs/zGh7R9kUW4k/s1600-h/image%25255B21%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-psVFsl9jiD8/Tqf_yOVzJsI/AAAAAAAAEW0/PqeWx1n3iwM/image_thumb%25255B15%25255D.png?imgmax=800" width="442" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;From the picture you can also see the list of supported unit test runners (ReSharper (5 and 6), MsTest and &lt;a href="http://www.specrun.com/"&gt;SpecRun&lt;/a&gt;). The TDD.NET is in the list, but the gateway is not yet implemented. Contributions for the TDD.NET gateway or any other that is not listed yet is welcome.&lt;/p&gt;  &lt;h5&gt;Cucumber harmonization&lt;/h5&gt;  &lt;p&gt;As you’ve probably heard, Richard Lawrence has &lt;a href="http://www.richardlawrence.info/2011/10/21/the-future-of-cucumber-on-net/"&gt;announced&lt;/a&gt; that the Cuke4Nuke project has been retired and we decided to merge our efforts to further improve &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;We have been working for a while with Richard, Paul, Christian, Jonas and Darren for the preparation of this and we have started to implement features to be better compatible with &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Currently we are at half-way. We have consolidated the terms (e.g. using “hook”) and validated/fixed some obvious compatibility problem. The remaining stuff is mainly concerning the table manipulation API, that is currently covered by the Assist namespace in SpecFlow. Regarding this, we would like to&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;make the table API extensions better discoverable by merging them to the main “TechTalk.SpecFlow” namespace &lt;/li&gt;    &lt;li&gt;consolidate the different CompareToX methods into one &lt;/li&gt;    &lt;li&gt;improve the output of the table comparison methods &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Improvements in the SpecFlow architecture&lt;/h5&gt;  &lt;p&gt;SpecFlow has an evolving architecture so there are always improvements here as the features grow. 1.8 is maybe sill an interesting milestone, because we have fully refactored the class-dependency model of the runtime code and have replaced the custom object factory solution with a DI tool. &lt;/p&gt;  &lt;p&gt;This step was important, because this consolidated and solved issues with the &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Sharing-Data-between-Bindings"&gt;context injection&lt;/a&gt; feature (e.g. disposing injected objects) and also because this has opened up new ways for customizing SpecFlow. Here is an example for the customization:&lt;/p&gt;  &lt;p&gt;Let’s say you want to implement a custom way of reporting SpecFlow user errors (e.g. for doing something special for pending steps). For this you need to create a class that implements the &lt;em&gt;IErrorProvider&lt;/em&gt; interface. You can let SpecFlow use your custom provider by changing the default dependencies in the configuration like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-DkwbwZpWyWQ/Tqf_yu_p2KI/AAAAAAAAEW8/FcL8zXqx2X0/s1600-h/image%25255B27%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-C1wl45s16uM/Tqf_zZ84YuI/AAAAAAAAEXE/NSWa3QfOlhU/image_thumb%25255B24%25255D.png?imgmax=800" width="442" height="130" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also the context injection feature can resolve the SpecFlow classes as well, so for example if you need to apply the same conversion logic as SpecFlow uses in your code (including &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions"&gt;step argument conversions&lt;/a&gt;), you can just let an &lt;em&gt;IStepArgumentTypeConverter&lt;/em&gt; instance be injected to your step definition class like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-GACU8HBUUqY/Tqf_0KXA-rI/AAAAAAAAEXM/QSao9wjUXQg/s1600-h/image%25255B32%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-orgl2rukiy0/Tqf_0-2Iw6I/AAAAAAAAEXQ/1dRn-uWx2JY/image_thumb%25255B27%25255D.png?imgmax=800" width="442" height="263" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;SpecFlow tests for SpecFlow&lt;/h5&gt;  &lt;p&gt;Also a new improvement in the SpecFlow solution that now the specifications and the integration tests have got a new platform. The projects &lt;a href="https://github.com/techtalk/SpecFlow/tree/master/Tests/TechTalk.SpecFlow.Specs"&gt;TechTalk.SpecFlow.Specs&lt;/a&gt; and &lt;a href="https://github.com/techtalk/SpecFlow/tree/master/Tests/TechTalk.SpecFlow.IntegrationTests"&gt;TechTalk.SpecFlow.IntegrationTests&lt;/a&gt; contain SpecFlow tests for SpecFlow itself. The existing non-unit tests have been converted to the new model and I have also added a couple of additional tests, but the coverage is not yet close to complete. My hope is that with the established environment, it will be easier for the contributors to also provide SpecFlow end-to-end tests for the new features. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-eyy7BELSzWI/Tqf_1vq-FWI/AAAAAAAAEXc/yl6y10gsS-A/s1600-h/image%25255B37%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-2vApdNwm0V8/Tqf_2j-LsvI/AAAAAAAAEXk/zWbsxsz7uxE/image_thumb%25255B30%25255D.png?imgmax=800" width="442" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There is a similar work also in Cucumber, the &lt;a href="https://github.com/cucumber/cucumber-features"&gt;cucumber-features&lt;/a&gt;. The goal is to make the necessary step definitions that SpecFlow can also run (and pass) these scenarios. But this is something to do still.&lt;/p&gt;  &lt;h5&gt;SpecRun&lt;/h5&gt;  &lt;p&gt;If you have followed the posts and tweets of &lt;a href="http://www.techtalk.at"&gt;TechTalk&lt;/a&gt;, you might know that we are also working on an integration test runner tool, that provides smarter (better, faster, more integrated) feedback for integration test execution. &lt;/p&gt;  &lt;p&gt;The SpecRun beta has been updated to be compatible with SpecFlow 1.8.1. Take a look at the website: &lt;a href="http://www.specrun.com"&gt;http://www.specrun.com&lt;/a&gt; or just grab the &lt;a href="http://www.nuget.org/List/Packages/SpecRun"&gt;nuget package&lt;/a&gt; into your project:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;Install-Package SpecRun -ProjectName MyProject&lt;/font&gt;&lt;/p&gt;  &lt;h5&gt;SpecFlow next steps&lt;/h5&gt;  &lt;p&gt;This post is really getting too long, so just a few bullet point for the future ideas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;continue with Cucumber harmonization &lt;/li&gt;    &lt;li&gt;improve VS2010 step analysis (performance, stability) &lt;/li&gt;    &lt;li&gt;improve step definition skeleton generation (based on the &lt;a href="https://github.com/techtalk/SpecFlow/pull/113"&gt;pull request of pmchugh&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;.NET 4.0 specific enhancements &lt;/li&gt;    &lt;li&gt;simplify customizations with plugin infrastructure &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Download it now!&lt;/h5&gt;  &lt;p&gt;Don’t forget, that the VS integration is independent from the project dependencies, so you don’t have to wait until all your projects can upgrade to 1.8. Go ahead and download the &lt;a href="http://www.specflow.org/downloads/installer.aspx"&gt;installer for 1.8&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Please also take a look at the &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Documentation"&gt;documentation&lt;/a&gt;. It’s getting better and better, but if you see any glitches in it: it’s a wiki, so just fix it!&lt;/p&gt;  &lt;p&gt;Have fun!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-199155459955408443?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/6tzN7zBFqvs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/199155459955408443/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=199155459955408443" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/199155459955408443?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/199155459955408443?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/6tzN7zBFqvs/specflow-18.html" title="SpecFlow 1.8" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-p_Qhlhed8Ts/Tqf_wO0ozrI/AAAAAAAAEWk/Qdg4OH7jgC4/s72-c/image_thumb%25255B12%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/10/specflow-18.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQBR3g4eip7ImA9WhdXGUo.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-7663903457041459935</id><published>2011-09-02T16:05:00.001+02:00</published><updated>2011-09-02T16:05:56.632+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-02T16:05:56.632+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SpecRun" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>SpecRun – because integration tests are not unit tests</title><content type="html">&lt;p&gt;We have started the &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; project in 2009 to provide a tool for .NET developers to perform BDD-style functional testing. SpecFlow uses unit testing frameworks, like NUnit, MsTest or MbUnit to execute the Gherkin scenarios. While this was a pragmatic choice, it has turned out that for executing functional integration tests, these unit test frameworks are not optimal (quite understandable, as they are &lt;em&gt;unit testing &lt;/em&gt;frameworks and not integration testing frameworks). While they can execute the tests very well, they lack features like&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;(html) report as primary output&lt;/li&gt;    &lt;li&gt;fast integration test execution by parallelization&lt;/li&gt;    &lt;li&gt;advanced execution metrics: execution time, memory usage, memory leaking, benchmarking&lt;/li&gt;    &lt;li&gt;detection of “random failures”&lt;/li&gt;    &lt;li&gt;test variations (e.g. running the same suite for IE and Firefox)&lt;/li&gt;    &lt;li&gt;support for applying different test configurations&lt;/li&gt;    &lt;li&gt;provide fast feedback about failures (prioritize failing tests first, stop after a number of failures, etc.)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In addition to that, we were missing a test runner that treats Gherkin features, scenarios and scenario outlines as first-class citizens. &lt;/p&gt;  &lt;p&gt;To address these problems, we have decided to launch a new product that fits into the SpecFlow-&lt;a href="http://www.speclog.net"&gt;SpecLog&lt;/a&gt; context. It has been publicly announced today, so it’s here: &lt;a href="http://www.specrun.com"&gt;SpecRun&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-aVGpPZymqXM/TmDivH0ulOI/AAAAAAAAD4I/Q1V-BxyoK8I/s1600-h/specrun_logo%25255B5%25255D.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="specrun_logo" alt="specrun_logo" src="http://lh3.ggpht.com/-MyZkxd99Mgk/TmDiwd-x8MI/AAAAAAAAD4M/eI3VvXO73HY/specrun_logo_thumb%25255B3%25255D.png?imgmax=800" width="240" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We have been working for this tool for a while now and have tested it in our projects. It is really promising. It seems that with parallel execution, the local test execution time (that is more critical from the cost perspective, as developers can’t progress while the tests are running) can be dropped to ca. 60%, that is almost half time. This and the smarter feedback about the errors were received very positively by the developers on the selected projects. They were more willing to run the tests locally reducing the long round-trips and they were able to detect the root cause of the errors better. &lt;/p&gt;  &lt;p&gt;SpecRun is also using SpecRun for testing itself obviously, and our own dog food tastes pretty good!&lt;/p&gt;  &lt;p&gt;SpecRun will be a commercial product (with free versions for OSS projects of course). This was a hard decision. We have a wonderful community around SpecFlow and the support of &lt;a href="http://www.techtalk.at"&gt;TechTalk&lt;/a&gt;, but even this way we could not afford the costs of building up so many new things. I think this is a good combination. While we believe that SpecRun is a great help and provides quick ROI for the users, it is not the main concern of SpecFlow. With the separation of the two aspects, we can have still our SpecFlow efforts focused on the main concerns (editor, runtime API, documentation) and also provide an extension for the smarter execution experience. &lt;/p&gt;  &lt;p&gt;SpecRun is currently in a closed beta stage, but we are planning to have the commercial release soon. Have a look at our website: &lt;a href="http://www.specrun.com"&gt;http://www.specrun.com&lt;/a&gt;, stay tuned on our twitter account: @specrun and contact &lt;a href="mailto:info@specrun.com"&gt;info@specrun.com&lt;/a&gt; if you are interested in participating in the beta program.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-7663903457041459935?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/qZKAgqft9ng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/7663903457041459935/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=7663903457041459935" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7663903457041459935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7663903457041459935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/qZKAgqft9ng/specrun-because-integration-tests-are.html" title="SpecRun – because integration tests are not unit tests" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-MyZkxd99Mgk/TmDiwd-x8MI/AAAAAAAAD4M/eI3VvXO73HY/s72-c/specrun_logo_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/09/specrun-because-integration-tests-are.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUBRH84cSp7ImA9WhdREUQ.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-6717055759523963628</id><published>2011-08-01T10:42:00.001+02:00</published><updated>2011-08-01T11:17:35.139+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-01T11:17:35.139+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Enhanced upgrading options in SpecFlow v1.7</title><content type="html">&lt;p&gt;We have just &lt;a href="http://groups.google.com/group/specflow-announcements/browse_thread/thread/871538c650317f00"&gt;released SpecFlow v1.7&lt;/a&gt; over the weekend. In this release there are extended integration options for the &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Testing-Silverlight-Asynchronous-Code"&gt;Silverlight async testing framework&lt;/a&gt; and also for &lt;a href="https://github.com/techtalk/SpecFlow/wiki/SharpDevelop-Integration"&gt;SharpDevelop 4&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;In addition to that, we have tried to make the upgrade process easier for the SpecFlow users, especially if they work in bigger teams or on different projects in parallel. &lt;/p&gt;  &lt;p&gt;The decision to upgrade a tool for a project is usually made carefully. You have to consider your close deadlines, check the breaking changes, and discuss it with the team. &lt;/p&gt;  &lt;p&gt;If you work on multiple projects in parallel (e.g. you have to support and older project too), it can be quite hard to synchronize that all projects upgrade at the same time.&lt;/p&gt;  &lt;p&gt;As SpecFlow is (was) a single msi installer and the different versions cannot be easily installed side-by-side, the upgrade process was sometimes challenging.&lt;/p&gt;  &lt;p&gt;From v1.7 we have managed to have better separation of the components that are directly used by the project (the generator and the runtime) and the IDE integration. With this, you can upgrade SpecFlow on your machine and &lt;strong&gt;defer the upgrade for the individual projects&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;For that to work, please ensure that your project is using SpecFlow 1.6 or later and it is setup as one of the following (see further advanced options in the &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Setup-SpecFlow-Projects"&gt;documentation&lt;/a&gt;):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SpecFlow is configured in the project as a &lt;a href="https://github.com/techtalk/SpecFlow/wiki/NuGet-Integration"&gt;NuGet package&lt;/a&gt; (this is the easiest and the recommended option). &lt;/li&gt;    &lt;li&gt;SpecFlow assemblies (not only TechTalk.SpecFlow.dll, but (almost) all the assemblies from the SpecFlow installation folder) are copied into your project folder structure and the reference for the TechTalk.SpecFlow.dll is taken from this folder. See the detailed list of required assemblies in &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Setup-SpecFlow-Projects"&gt;this documentation page&lt;/a&gt; (last section).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you have this setup, you can safely install a newer SpecFlow version on your machine. The projects will still use the configured generator and runtime. &lt;/p&gt;  &lt;p&gt;When you feel confortable to upgrade SpecFlow on your project as well, you can do that project-by-project (the easiest it to use &lt;a href="http://nuget.org/"&gt;NuGet&lt;/a&gt; upgrade).&lt;/p&gt;  &lt;p&gt;Note 1: Please make sure that the SpecFlow version on the machine is the same or newer than the SpecFlow version used by the projects. &lt;/p&gt;  &lt;p&gt;Note 2: This feature works currently with Visual Studio 2010 only.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;SpecFlow is and open-source project sponsored by &lt;a href="http://www.techtalk.at"&gt;TechTalk&lt;/a&gt;. You can also support the project by contributing on &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Contributing"&gt;github&lt;/a&gt; or by “&lt;a href="http://www.specflow.org/about/adopt.aspx"&gt;adopting a feature&lt;/a&gt;” ;-). TechTalk also provides &lt;a href="http://www.specflow.org/about/packages.aspx"&gt;commercial support&lt;/a&gt; for SpecFlow. &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Learn SpecFlow at the the Progressive .NET Tutorials: &lt;a title="http://skillsmatter.com/event/open-source-dot-net/progressive-dot-net-tutorials-2011" href="http://skillsmatter.com/event/open-source-dot-net/progressive-dot-net-tutorials-2011"&gt;http://skillsmatter.com/event/open-source-dot-net/progressive-dot-net-tutorials-2011&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-6717055759523963628?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/6ptzBr2j1Dk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/6717055759523963628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=6717055759523963628" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6717055759523963628?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6717055759523963628?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/6ptzBr2j1Dk/enhanced-upgrading-options-in-specflow.html" title="Enhanced upgrading options in SpecFlow v1.7" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/08/enhanced-upgrading-options-in-specflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMR3g-cSp7ImA9WhdTGUo.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-7885414537620975267</id><published>2011-07-18T09:23:00.001+02:00</published><updated>2011-07-18T09:23:06.659+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T09:23:06.659+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Tracing Web Automation Test Errors with SpecFlow</title><content type="html">&lt;p&gt;If you try to run your automated UI tests on the build server, you can quickly run into problems that are quite hard to analyze.&lt;/p&gt;  &lt;p&gt;The most common scenario is that one of your assertion like “Then my name should be displayed” fails, because the web driver does not find your name in the resulting page. It works locally, but what’s the problem on the build server? Permission problems? Timing issues? Browser compatibility? Different locale? Web compilation or configuration errors? All of these are potential candidates, but it is hard to find out quickly which one.&lt;/p&gt;  &lt;p&gt;We are using the following &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; &lt;a href="https://github.com/techtalk/SpecFlow/wiki/Event-bindings"&gt;event binding&lt;/a&gt; to trace the content of the current page in case of an error. In many cases from the page content it’s easy to say what the problem was. &lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 268px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[AfterScenario]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AfterWebScenario()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ScenarioContext.Current.TestError != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Page src for failing test: {0}&amp;quot;&lt;/span&gt;,&lt;br /&gt;            BrowserContext.SeleniumWebDriver.PageSource);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;//... (if you stop your browser session after&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;//     each scenario, this comes here probably, &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;//     to ensure that the tracing runs before)&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-7885414537620975267?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/HmNYlHChrlM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/7885414537620975267/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=7885414537620975267" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7885414537620975267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7885414537620975267?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/HmNYlHChrlM/tracing-web-automation-test-errors-with.html" title="Tracing Web Automation Test Errors with SpecFlow" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/07/tracing-web-automation-test-errors-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cMQ3c7cCp7ImA9WhZbEEk.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-6391107014015686693</id><published>2011-06-14T11:51:00.001+02:00</published><updated>2011-06-14T11:51:22.908+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-14T11:51:22.908+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Course" /><title>Git &amp; Dropbox for preparing live demos</title><content type="html">&lt;p&gt;I have arrived from Oslo where we did two sessions with Jonas Bandi on NDC 2011 about &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;As Jonas lives in Switzerland and I live in Hungary, we have used Dropbox to synchronize the content we are working on. This was fine for slides and other notes, but for the code demo we did not have the right toolset so far. &lt;/p&gt;  &lt;p&gt;Actually I like to do demos where I modify and evolve the code during the session. But if you do so, you need to maintain different versions of the code base. You need a baseline to start the demo from and probably also a “done” version if something goes wrong. Additionally you need to be able to revert back to the baseline while practicing the demo. This begs for a SCC and Git is a perfect choice.&lt;/p&gt;  &lt;p&gt;To have a little bit of “surprise” effect, I don’t like to publish my demos upfront so did not wanted to put it into a github repository. To be able to share the code with Jonas, this time we’ve tried to combine Git with Dropbox like this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;create a “bare” git repository into a dropbox folder&lt;/li&gt;    &lt;li&gt;clone it to your working folder&lt;/li&gt;    &lt;li&gt;work on the code &amp;amp; commit changes&lt;/li&gt;    &lt;li&gt;push the changes to the dropbox folder (the origin)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Though I’m pretty sure that this is not a well scaling solution for real development, but for two persons it was just fine &amp;amp; simple.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-6391107014015686693?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/qzX1PcWOEcQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/6391107014015686693/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=6391107014015686693" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6391107014015686693?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6391107014015686693?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/qzX1PcWOEcQ/git-dropbox-for-preparing-live-demos.html" title="Git &amp;amp; Dropbox for preparing live demos" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/06/git-dropbox-for-preparing-live-demos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQDR3w7eSp7ImA9WhZVGEg.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-1312989041266097622</id><published>2011-05-31T17:06:00.001+02:00</published><updated>2011-05-31T17:06:16.201+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T17:06:16.201+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CSD" /><category scheme="http://www.blogger.com/atom/ns#" term="developer" /><category scheme="http://www.blogger.com/atom/ns#" term="Course" /><title>Agile Developer Course in Vienna</title><content type="html">&lt;p&gt;In summer everyone is on holidays, the projects are running on low frequency, so maybe it’s a good time to meet others and improve your agile development skills. &lt;/p&gt;  &lt;p&gt;July 6-8, 2011 there will be a three-day course in Vienna instructed by me (in English) that focuses on agile engineering practices and team collaboration. The attendees can also practice behavior driven development (with &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt;) and TDD. This is all done through a lot of hands-on exercises and group discussions.&lt;/p&gt;  &lt;p&gt;There are two days left for the discounted price!&lt;/p&gt;  &lt;p&gt;Details &amp;amp; registration: &lt;a title="http://www.techtalk.at/scrum-trainings/certified-scrum-developer.html" href="http://www.techtalk.at/scrum-trainings/certified-scrum-developer.html"&gt;http://www.techtalk.at/scrum-trainings/certified-scrum-developer.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(Successful completion of the course can be credited towards the &lt;a href="http://www.scrumalliance.org/pages/certified_scrum_developer"&gt;Certified Scrum Developer&lt;/a&gt; (CSD) certification of Scrum Alliance.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-1312989041266097622?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/qVzAOTgSBZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/1312989041266097622/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=1312989041266097622" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/1312989041266097622?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/1312989041266097622?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/qVzAOTgSBZc/agile-developer-course-in-vienna.html" title="Agile Developer Course in Vienna" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/05/agile-developer-course-in-vienna.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YARHY6eip7ImA9WhZXFkQ.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-7554321682393418103</id><published>2011-05-06T16:12:00.001+02:00</published><updated>2011-05-06T16:12:25.812+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-06T16:12:25.812+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="developer" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Testing manually vs. SpecFlow</title><content type="html">&lt;p&gt;No, I cannot answer this general question. Just had a nice story in our team and since I’m sure that Mátyás and Viktor will never blog this, I do it now on behalf of them.&lt;/p&gt;  &lt;p&gt;We are working on a small project, where we have to implement a smaller module for an existing system. Interesting project, but not BDD at all. Especially there are no automated tests.&lt;/p&gt;  &lt;p&gt;Since the project is really small and it has to fit into this bigger existing system, we decided not to introduce &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; there (was a hard decision, you can imagine :).&lt;/p&gt;  &lt;p&gt;We are near to finish the first sprint (well, we have introduced Scrum and user stories to the project still), so we started to think about the demo and that we should some manual testing. But how?&lt;/p&gt;  &lt;p&gt;The majority of Sprint 1 was a background job that had to process some data depending on some complex rules. So we sat down after the daily standup yesterday and brainstormed the different cases we want to test. “Surprisingly” the cases were pretty much look like acceptance criteria &lt;a href="http://specificationbyexample.com/"&gt;illustrated with examples&lt;/a&gt;. As there were too many cases (11) for manual testing, we have selected the 5 most important to be tested.&lt;/p&gt;  &lt;p&gt;We had two choices: either we try to find matching data in our test database and test the cases with them or we create test data for our own (with SQL scripts?).&lt;/p&gt;  &lt;p&gt;Finally we have chosen the third option: decided to create our own test data, but through Gherkin &amp;amp; SpecFlow. It was a risky decision (budget, deadline, etc.), so we decided for a 1 dev, 1 day time-boxed spike to do it. This was at 9:30am. &lt;/p&gt;  &lt;p&gt;To make the story short, at 17:11, the Gherkin files were created and bound for all 11 tests… and they were green (like &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;And the funniest thing is, that we’ve found a bug… a very tricky one that would not have shown up in the manual tests most probably!&lt;/p&gt;  &lt;p&gt;This was very convincing! To be honest, I did not expect to be finished in one day. I was asking Mátyás today morning in the standup carefully, what happened. He said: “Yeah, I’m sitting next to Viktor and doing some pair programming”. I was asking back (trying to hold back my excitement): “And what happened with the SpecFlow tests?” He said very calmly (he is a cool guy): “Ah, yeah the SpecFlow tests are done already. They are all green”. &lt;/p&gt;  &lt;p&gt;Not even mentioning the extra benefit, that we can show the automated tests to the customer so they can also create new test variants quickly. &lt;/p&gt;  &lt;p&gt;So, thanks for the good job, guys! &lt;/p&gt;  &lt;p&gt;P.S.: Just to improve your C# skills, I also share buggy code (without comment):&lt;/p&gt;  &lt;p align="center"&gt;&lt;font size="5"&gt;a ?? 0 + b ?? 0 &lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-7554321682393418103?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/K0ovkCJ8Vmo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/7554321682393418103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=7554321682393418103" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7554321682393418103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/7554321682393418103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/K0ovkCJ8Vmo/testing-manually-vs-specflow.html" title="Testing manually vs. SpecFlow" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/05/testing-manually-vs-specflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MGRHwzfCp7ImA9WhZRFU0.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-4740360720002305665</id><published>2011-04-11T10:10:00.001+02:00</published><updated>2011-04-11T10:10:25.284+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-11T10:10:25.284+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Re: Rapid Feedback</title><content type="html">&lt;p&gt;I’ve read yesterday evening the &lt;a href="http://www.adomokos.com/2011/04/rapid-feedback.html"&gt;post&lt;/a&gt; of Attila Domokos about rapid feedback that made me thinking. Here is my reaction that didn’t fit to a regular blog post comment.&lt;/p&gt;  &lt;p&gt;I think no company should afford wasted time and having a development environment that is determined to waste time is a usually forgotten, but important factor in this. The scenario that has been described by Attila is known to all of us. Well known. Though the story can end many different ways. For Attila, Rails was the “solution”. For me it is BDD and good practices. (I’m not against Rails at all. Rails is fine, but these problems have to be solved within .NET for most of us.) I’m absolutely agreeing with the idea however, to use the right tool (framework) for the right job, but it would be very sad if it would turn out that WPF development cannot be efficient. (I’m not sure though… I know another Attila who would immediately tell me that it cannot, but I’m still hoping.)&lt;/p&gt;  &lt;p&gt;[BTW: I’m pretty sure that there are a lot of devs (not the ones working with me fortunately), who actually love this situation and use the compilation times to read the daily newspaper.]&amp;#160; &lt;/p&gt;  &lt;p&gt;As a developer and developer coach, I always try to ensure that the team is taking the time (early enough) to setup a development environment where you can get rapid feedback. For a WPF-frontend .NET app, here are my suggestions (I’m not saying that we can always do all unfortunately):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do BDD/ATDD in a test-first, outside-in way, so that usually you don’t have to start up the application for testing the functionality. (We do this with &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; of course. :-)&lt;/li&gt;    &lt;li&gt;Consider testing the functionality at the controller level (as well?), in order to get feedback about the implemented functionality without the slow UI automation. (At least until we have a good test framework where the automated UI testing is really easy and fast.)&lt;/li&gt;    &lt;li&gt;Do TDD for your inner components. Ensure that the unit testing environment and practices are confortable and helpful. If the tests are executed only after the run-and-test round has been done, you did not win too much.&lt;/li&gt;    &lt;li&gt;For WPF, (try to) make sure that your controls can be seen in the VS designer or blend (aka “blendable”), so that you don’t have to start the application for pixel proofing. There are infrastructure for design-time data, but introducing it late is very hard.&lt;/li&gt;    &lt;li&gt;Implement shortcuts to your application that the run-and-see test can be also done more efficiently. For example, you can make a stub authentication/authorization provider that bypasses the login screen.&lt;/li&gt;    &lt;li&gt;Optimize the build process to be fast - review and remove projects, post-build events, slow signing process, etc. from the build configuration that you use for development. (Be very careful with post-IL tools, like Code Contracts or PostSharp.)&lt;/li&gt;    &lt;li&gt;Measure the difference and argue for faster development machines, solid-state drives.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Still, it can happen that you have to wait. Personally, I’m using this waiting time for “development”: Even if I’m not doing TDD, I always follow the practice of “making a small piece work” and then “making it better” (refactoring). So while it is building, starting up, etc. I’m already thinking about the refactoring possibilities. Try it! It’s a little bit exhausting, but fun!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-4740360720002305665?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/XJW1_Vn32o0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/4740360720002305665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=4740360720002305665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4740360720002305665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4740360720002305665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/XJW1_Vn32o0/re-rapid-feedback.html" title="Re: Rapid Feedback" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/04/re-rapid-feedback.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ENQHs_fip7ImA9WhZREEw.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-6322769144776800397</id><published>2011-04-05T15:54:00.001+02:00</published><updated>2011-04-05T15:54:51.546+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T15:54:51.546+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>SpecFlow 1.6 and after…</title><content type="html">&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/TZsfJh6hUnI/AAAAAAAAC4k/yQIk-TQE9Sw/s1600-h/logo%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="logo" border="0" alt="logo" align="right" src="http://lh4.ggpht.com/_BvHWk-52Bdk/TZsfKBI0-_I/AAAAAAAAC4o/YUM3zBW019U/logo_thumb.png?imgmax=800" width="244" height="93" /&gt;&lt;/a&gt;After a lot of work we have finally released &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; 1.6. This was an important milestone of SpecFlow for several reasons:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Altogether 11 people have contributed (in compare to 1.5, where “only” 6)&lt;/li&gt;    &lt;li&gt;Effective usage of the public &lt;a href="http://build.specflow.org/"&gt;build server&lt;/a&gt;, for the contribution and for preliminary results &lt;/li&gt;    &lt;li&gt;&lt;a href="http://nuget.org/"&gt;NuGet&lt;/a&gt; package published together with the release &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are many smaller improvements and fixes, but the most important new features are these (see the &lt;a href="http://groups.google.com/group/specflow/browse_thread/thread/e7fab9d90cc13da8"&gt;announcement&lt;/a&gt; and the detailed &lt;a href="https://github.com/techtalk/SpecFlow/blob/master/changelog.txt"&gt;change log&lt;/a&gt; for further details):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio 2010 integration improvements (improved intellisense, go to binding, automatic table formatting) &lt;/li&gt;    &lt;li&gt;Windows Phone 7 support &lt;/li&gt;    &lt;li&gt;Assist improvements (dynamic getter for ScenarioContext,      &lt;br /&gt;Table.FillInstance()) &lt;/li&gt;    &lt;li&gt;Step argument transformation for tables and multi-line text      &lt;br /&gt;arguments &lt;/li&gt;    &lt;li&gt;Integration with &lt;a href="http://github.com/aslakhellesoy/gherkin"&gt;Gherkin parser&lt;/a&gt; v2.3.5 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I have &lt;a href="http://gasparnagy.blogspot.com/2011/03/highlights-of-specflows-new-vs2010.html"&gt;posted&lt;/a&gt; recently about the VS2010 improvements and &lt;a href="http://gasparnagy.blogspot.com/2011/04/automatic-table-formatting-in-specflow.html"&gt;automatic table formatting&lt;/a&gt;. If you experience any problems with this features, you can enable SpecFlow debug tracing or disable the problematic features in Tools / Options / SpecFlow. (The trace is emitted to the output window.)&lt;/p&gt;  &lt;p&gt;And what will come after 1.6? We have of course several ideas how to improve SpecFlow. Here is a (probably incomplete) list of directions we want to go:&lt;/p&gt;  &lt;h5&gt;1. Using the generator from the project’s lib folder&lt;/h5&gt;  &lt;p&gt;The generator interface have been prepared now for running from a different AppDomain, so we want to change the VS2010 integration in a way, that it detects the generator in the project’s lib folder (that was placed there through NuGet for example) and perform the test generation with that. The benefit: the VS integration would be more independent of the runtime and the tools. You can then decide project-by-project when to upgrade to a newer SpecFlow release. Less problems with breaking changes - more frequent releases.&lt;/p&gt;  &lt;h5&gt;2. Share VS2010 improvements with MonoDevelop&lt;/h5&gt;  &lt;p&gt;The core infrastructure we use for intellisense and navigation is Visual Studio independent, so we want to reuse that also for the &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; integration. For that the implementation has to be restructured a bit and the VS-independent parts have to be extracted. We do this together with Dale Ragan, who is the master of the SpecFlow Mono/MonoDevelop integration.&lt;/p&gt;  &lt;p&gt;On the &lt;a href="http://skillsmatter.com/event/agile-scrum/cukeup"&gt;CukeUp!&lt;/a&gt; I had a good discussion with Aslak Hellesøy about standardizing the data gathered for the autocomplete (e.g. in a json format). This data could be generated build-time and used for other tools in the Cucumber-family providing rich editing experiences. Interesting, isn’t it? Let’s see.&lt;/p&gt;  &lt;h5&gt;3. Remove duplicated binding-match logic&lt;/h5&gt;  &lt;p&gt;Currently the logic that decides whether a scenario step matches for a binding is duplicated in the runtime and in the VS integration. This should be cleaned up. &lt;/p&gt;  &lt;p&gt;As a part of this, we will establish a dependency between the generator and the runtime (generator depends on runtime), so the file-based sharing can be eliminated.&lt;/p&gt;  &lt;h5&gt;4. Better dependency handling&lt;/h5&gt;  &lt;p&gt;I have started to setup a better DI solution for SpecFlow, for&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;better support for parallel scenarios (eliminate static stuff) &lt;/li&gt;    &lt;li&gt;better extensibility – being able to set/override any dependencies from the config file &lt;/li&gt;    &lt;li&gt;better support for unit testing &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Currently I’m using a &lt;a href="https://github.com/gasparnagy/MiniDi"&gt;mini DI framework&lt;/a&gt;, that can be embedded as a single source file (called MiniDi). This is a huge refactoring, so I try to do it step-by-step. &lt;/p&gt;  &lt;h5&gt;5. Runtime platform improvements&lt;/h5&gt;  &lt;p&gt;We do want to further improve the support for alternative platform runtimes, like Silverlight or Windows Phone 7 with the help of the contributors. Currently Matt Ellis is &lt;a href="http://groups.google.com/group/specflow/browse_thread/thread/93a722349c1f8680/d02b410a75ca4baf?show_docid=d02b410a75ca4baf"&gt;working&lt;/a&gt; on the asynchronous Silverlight support. &lt;/p&gt;  &lt;h5&gt;6. Visual Studio 2010 integration improvements&lt;/h5&gt;  &lt;p&gt;There are a lot of ideas still to improve the editing and navigation experience, like showing the binding status of a step, commenting out scenario blocks or running the focused scenarios from context menu. &lt;/p&gt;  &lt;h5&gt;7. Documentation, documentation, documentation&lt;/h5&gt;  &lt;p&gt;Yes, I know. This is something to be improved. But I hope that by using the &lt;a href="https://github.com/techtalk/SpecFlow/wiki"&gt;github wiki&lt;/a&gt; it will be easier to complete the docs and keep it up-to-date. &lt;/p&gt;  &lt;p&gt;---&lt;/p&gt;  &lt;p&gt;Like before, we are collecting feedback about SpecFlow also through a (new) survey – please &lt;a href="https://spreadsheets.google.com/viewform?formkey=dFdsY0xWNVZqcHVEV21vRnhrYXF1YUE6MA#gid=0"&gt;fill it in&lt;/a&gt; (anonymously or with your name) to help our work. &lt;/p&gt;  &lt;p&gt;Once again, thanks to the contributors for their great work in SpecFlow. Also thanks to &lt;a href="http://www.techtalk.at/"&gt;TechTalk&lt;/a&gt; for sponsoring the development and the infrastructure of this open-source project.&lt;/p&gt;  &lt;p&gt;---&lt;/p&gt;  &lt;p&gt;&lt;a title="SpecLog" href="http://www.speclog.net/"&gt;&lt;img style="margin: 0px 11px 0px 0px; display: inline; float: left" title="image" alt="image" align="left" src="http://lh4.ggpht.com/_BvHWk-52Bdk/TZsfKrNGwyI/AAAAAAAAC4s/w_vgEh1cJUQ/image%5B4%5D.png?imgmax=800" width="70" height="71" /&gt;&lt;/a&gt;&lt;em&gt;At TechTalk we are developing another product, SpecLog, that supports managing your requirements in agile projects. Please have a look at our website: &lt;/em&gt;&lt;a title="http://www.speclog.net/" href="http://www.speclog.net/"&gt;&lt;em&gt;http://www.speclog.net/&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-6322769144776800397?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/MhCmbkslP-s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/6322769144776800397/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=6322769144776800397" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6322769144776800397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/6322769144776800397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/MhCmbkslP-s/specflow-16-and-after.html" title="SpecFlow 1.6 and after…" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_BvHWk-52Bdk/TZsfKBI0-_I/AAAAAAAAC4o/YUM3zBW019U/s72-c/logo_thumb.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/04/specflow-16-and-after.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8BR3s8cCp7ImA9WhZREE0.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-5858049883128277784</id><published>2011-04-05T12:51:00.002+02:00</published><updated>2011-04-05T12:54:16.578+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T12:54:16.578+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="Gherkin" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Automatic Table Formatting in SpecFlow</title><content type="html">&lt;p&gt;In the new &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; v1.6 &lt;a href="http://www.specflow.org/downloads/installer.aspx"&gt;release&lt;/a&gt;, besides other Visual Studio 2010 integration improvements there is one more that I did not mention in my previous &lt;a href="http://gasparnagy.blogspot.com/2011/03/highlights-of-specflows-new-vs2010.html"&gt;post&lt;/a&gt;: the automatic table formatting.&lt;/p&gt;  &lt;p&gt;I have spent a lot of time by aligning the table columns in the Gherkin files. This new feature tries to address this problem: whenever you type a pipe (|) character in a table that has at least two rows, it realigns the table columns. Here are the rules for the aligning:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the column widths are calculated based on the cell texts (header and body) without starting/ending whitespaces &lt;/li&gt;    &lt;li&gt;the cell values are aligned to the left with a single padding space &lt;/li&gt;    &lt;li&gt;there is at least one padding space on the right &lt;/li&gt;    &lt;li&gt;the indentation whitespaces of the header row are repeated for the subsequent rows &lt;/li&gt;    &lt;li&gt;comment lines between table rows are handled &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The formatting is applied only to the table (parts) before the typed pipe character, simply because of technical reasons: it was easier to preserve the current cursor position this way. Though this sounds a bit weird, this should be still natural if you type in the table row-by-row. If you want to reformat an existing table, just simply re-type the last pipe character. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f2c51440-cc0f-43ce-a1b3-9df527b08f61" class="wlWriterEditableSmartContent"&gt;&lt;div id="74d4526e-f3ec-4340-a8fd-38763913b43f" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=D9NGxz16uPY&amp;amp;feature=youtube_gdata_player" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_BvHWk-52Bdk/TZr0OSl2IvI/AAAAAAAAC4g/XLkG_hN3Jxw/videobc84fd691bdc%5B8%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('74d4526e-f3ec-4340-a8fd-38763913b43f'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/D9NGxz16uPY?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/D9NGxz16uPY?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em"&gt;A short video showing this feature&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;If the automatic formatting is not something you like, you can either press “Undo” after you typed in the pipe, or you can disable this feature from Tools / Options / SpecFlow.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-5858049883128277784?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/zNwMVqdF21A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/5858049883128277784/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=5858049883128277784" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/5858049883128277784?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/5858049883128277784?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/zNwMVqdF21A/automatic-table-formatting-in-specflow.html" title="Automatic Table Formatting in SpecFlow" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_BvHWk-52Bdk/TZr0OSl2IvI/AAAAAAAAC4g/XLkG_hN3Jxw/s72-c/videobc84fd691bdc%5B8%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/04/automatic-table-formatting-in-specflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkINQXszfCp7ImA9WhZSFE0.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-3086792172853886455</id><published>2011-03-29T15:16:00.001+02:00</published><updated>2011-03-29T15:16:30.584+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-29T15:16:30.584+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Build" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><title>Building Windows Phone 7 Applications on build server without installing the SDK</title><content type="html">I don’t like installing SDKs on build servers, especially ones that are relative new and gets updated frequently. In the new &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; release, we provide support for WP7. In order to build this on our build server, I had to solve this problem. Here are my findings.   &lt;p&gt;I have based my work on the &lt;a href="http://www.jeff.wilcox.name/2010/03/sxs-sl3-sl4-build-machine/"&gt;post&lt;/a&gt; of Jeff Wilcox. The solution for WP7 is almost the same as he describes, but there is a small trick.&lt;/p&gt;  &lt;p&gt;So I have created the following folders in the project’s lib collection:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;lib\Silverlight\v4.0\Reference Assemblies&lt;/strong&gt; – with the content of &lt;em&gt;“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0”&lt;/em&gt;, except the &lt;em&gt;Profile&lt;/em&gt; folder. This can be also reused for normal SL4 projects. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;lib\Silverlight for Phone\v7.0\MSBuild&lt;/strong&gt; – with the content of &lt;em&gt;“C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0”&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;lib\Silverlight for Phone\v7.0\Libraries &lt;/strong&gt;– with the content of &lt;em&gt;“C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Libraries\Silverlight”&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;lib\Silverlight for Phone\v7.0\Reference Assemblies &lt;/strong&gt;– with the content of &lt;em&gt;“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone”&lt;/em&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfortunately there is a special step in the WP7 Microsoft.Silverlight.Common.targets file that sets the reference paths without any condition. Because of this, you cannot specify the paths explicitly. I have duplicated this target (GetFrameworkPaths) and decorated it with a condition. This I’ve saved to a separate targets file inside &lt;strong&gt;lib\Silverlight for Phone\v7.0\MSBuild &lt;/strong&gt;called &lt;strong&gt;Microsoft.Silverlight.Common.OverridesForBuild.targets&lt;/strong&gt;. You can download the entire file from &lt;a href="http://dl.dropbox.com/u/51289/BlogAttachments/Microsoft.Silverlight.Common.OverridesForBuild.targets"&gt;here&lt;/a&gt;, but the actual change is really just a condition:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;PropertyGroup&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #ff0000"&gt;Condition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;'$(UseCustomWindowsPhoneSDKFolder)'!='true'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;_FullFrameworkReferenceAssemblyPaths&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;… &lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TargetFrameworkDirectory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;… &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;After this preparation, you can change your project file to use the dependencies from the lib folder. For this you need to open the project file in an XML editor and change the Import sections to the following:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;WindowsPhoneBuildResources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;..\lib\Silverlight for Phone\v7.0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;WindowsPhoneBuildResources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SilverlightBuildResources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;..\lib\Silverlight\v4.0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SilverlightBuildResources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TargetFrameworkDirectory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;$(WindowsPhoneBuildResources)\Reference Assemblies&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TargetFrameworkDirectory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TargetFrameworkSDKDirectory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;$(WindowsPhoneBuildResources)\Libraries&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TargetFrameworkSDKDirectory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;_FullFrameworkReferenceAssemblyPaths&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;$(SilverlightBuildResources)\Reference Assemblies&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;_FullFrameworkReferenceAssemblyPaths&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;UseCustomWindowsPhoneSDKFolder&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;UseCustomWindowsPhoneSDKFolder&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;SilverlightRuntimeVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;4.0&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;SilverlightRuntimeVersion&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Import&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Project&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;$(WindowsPhoneBuildResources)\MSBuild\Microsoft.Silverlight.$(TargetFrameworkProfile).Overrides.targets&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Import&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Project&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;$(WindowsPhoneBuildResources)\MSBuild\Microsoft.Silverlight.CSharp.targets&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Import&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Project&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;$(WindowsPhoneBuildResources)\MSBuild\Microsoft.Silverlight.Common.OverridesForBuild.targets&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;You might need to change the lib folder reference in the first two properties according to your setup. &lt;/p&gt;

&lt;p&gt;With these I was able to build our solution on the build server.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-3086792172853886455?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/-_mHHY5K5yM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/3086792172853886455/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=3086792172853886455" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3086792172853886455?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3086792172853886455?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/-_mHHY5K5yM/building-windows-phone-7-applications.html" title="Building Windows Phone 7 Applications on build server without installing the SDK" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/03/building-windows-phone-7-applications.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBRXw-eip7ImA9WhZTF0w.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-4678863759512799961</id><published>2011-03-19T08:51:00.001+01:00</published><updated>2011-03-21T15:54:14.252+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-21T15:54:14.252+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>Highlights of SpecFlow’s new VS2010 integration features</title><content type="html">&lt;p&gt;The new &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; release will come with a few nice improvements for Visual Studio 2010 integration. I have made a few screenshots to show the most interesting ones. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/TYRgX6nGvUI/AAAAAAAACwI/P-mIvhJieiA/s1600-h/image%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_BvHWk-52Bdk/TYRgYeF78NI/AAAAAAAACwM/1_LqOPPblOA/image_thumb.png?imgmax=800" width="237" height="127" /&gt;&lt;/a&gt;&lt;em&gt;&amp;#160; &lt;br /&gt;Intellisense for keywords&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/TYRgY8pqxDI/AAAAAAAACwQ/L8638pg6PX0/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_BvHWk-52Bdk/TYRgZUH5LkI/AAAAAAAACwU/Ftdd-5BMYgs/image_thumb%5B4%5D.png?imgmax=800" width="444" height="95" /&gt;&lt;/a&gt;&lt;em&gt;Improved intellisense for steps, including binding information and examples from the feature files in the project (you can also see if the step was used in a scenario outline)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/TYRgZ7O4ybI/AAAAAAAACwY/nAGAu1rrCV0/s1600-h/image%5B12%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_BvHWk-52Bdk/TYRgad5GiqI/AAAAAAAACwc/eTciWo36VA0/image_thumb%5B6%5D.png?imgmax=800" width="444" height="143" /&gt;      &lt;br /&gt;&lt;/a&gt;&lt;em&gt;Go to binding - We have been waiting for this for a long time…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_BvHWk-52Bdk/TYRga08xpaI/AAAAAAAACwg/mEb1B7HmarE/s1600-h/image%5B17%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_BvHWk-52Bdk/TYRgberW2ZI/AAAAAAAACwk/2wxwq36VzHI/image_thumb%5B9%5D.png?imgmax=800" width="444" height="193" /&gt;      &lt;br /&gt;&lt;/a&gt;&lt;em&gt;Re-generating code-behind after changing the configuration&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/TYRgb-ek9SI/AAAAAAAACwo/oQxB4EQ5w6c/s1600-h/image%5B21%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_BvHWk-52Bdk/TYRgcldxa_I/AAAAAAAACws/uhiHRfwtSrM/image_thumb%5B11%5D.png?imgmax=800" width="444" height="201" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Re-generating code-behind after upgrading the project&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-4678863759512799961?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/-hTlj3k9P7c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/4678863759512799961/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=4678863759512799961" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4678863759512799961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4678863759512799961?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/-hTlj3k9P7c/highlights-of-specflows-new-vs2010.html" title="Highlights of SpecFlow’s new VS2010 integration features" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_BvHWk-52Bdk/TYRgYeF78NI/AAAAAAAACwM/1_LqOPPblOA/s72-c/image_thumb.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/03/highlights-of-specflows-new-vs2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcARnc6eCp7ImA9Wx9VFk4.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-3457846171846484311</id><published>2011-02-02T09:07:00.001+01:00</published><updated>2011-02-02T09:07:27.910+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-02T09:07:27.910+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SpecLog" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>SpecLog Comes!</title><content type="html">&lt;p&gt;In November 2009 we have started with the &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt; project to support .NET community with a BDD tool that is nicely integrating to the development environment. Through SpecFlow and the projects we delivered, we have learned a lot about agile requirement analysis and BDD.&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/TUkQtYRtfPI/AAAAAAAACME/Ezmx-gXansM/s1600-h/image%5B20%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/_BvHWk-52Bdk/TUkQucb3YlI/AAAAAAAACMI/mr1PdUBUnv0/image_thumb%5B6%5D.png?imgmax=800" width="203" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And now, after 14 months we also have something new to share! At the &lt;a href="http://skillsmatter.com/podcast/design-architecture/patterns-and-practices-of-building-gherkin-based-living-documentations"&gt;BDD eXchange&lt;/a&gt;, we have already talked about the development process of our new product, SpecLog, and now we are really close to release the first beta. On the right hand side, you can see our iteration burndown from today morning. &lt;/p&gt;  &lt;p&gt;SpecLog is a collaborative tool for agile requirement engineering with strong integration to SpecFlow and ALM tools (initially TFS 2010). Stay tuned to &lt;a href="http://www.speclog.net"&gt;http://www.speclog.net&lt;/a&gt;, where we will publish detailed information and the beta download this week. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/TUkQupGDgJI/AAAAAAAACMM/9T3r3ymhEeU/s1600-h/image%5B42%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_BvHWk-52Bdk/TUkQvJlvSjI/AAAAAAAACMQ/TlWbs4V-NnQ/image_thumb%5B25%5D.png?imgmax=800" width="444" height="348" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-3457846171846484311?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/Ijk_QaUOW5k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/3457846171846484311/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=3457846171846484311" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3457846171846484311?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3457846171846484311?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/Ijk_QaUOW5k/speclog-comes.html" title="SpecLog Comes!" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_BvHWk-52Bdk/TUkQucb3YlI/AAAAAAAACMI/mr1PdUBUnv0/s72-c/image_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2011/02/speclog-comes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkENSXYyfip7ImA9Wx5WEEw.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-2610575006285796728</id><published>2010-09-20T11:42:00.011+02:00</published><updated>2010-09-20T21:24:58.896+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-20T21:24:58.896+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PartCover" /><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity" /><title>Detailed Report for PartCover in TeamCity 5.1</title><content type="html">&lt;p&gt;I was configuring a build with &lt;a href="http://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt; (for &lt;a href="http://www.specflow.org/"&gt;SpecFlow&lt;/a&gt; that is hosted on github). After the initial success, I thought I would also enable code coverage in the build. I don't really believe in code coverage numbers, but if it is easy (and free) to configure, than why not?&lt;/p&gt;  &lt;p&gt;TeamCity supports NCover and PartCover out of the box. As I wanted to go for a free solution (SpecFlow is a free, open-source product), I used &lt;a href="http://sourceforge.net/projects/partcover/"&gt;PartCover&lt;/a&gt; (v4.0.10801). PartCover seems to be a great tool, but it is not so easy to set it up with TeamCity. (You can find a lot of questions and discussions about it.) As I can see, there are some improvements in the later versions of PartCover and TeamCity, but still there are some problems.&lt;/p&gt;  &lt;p&gt;If you just start with the build server configuration, you should read first Jeremy Skinner’s &lt;a href="http://www.jeremyskinner.co.uk/2010/07/23/using-teamcity-with-partcover-4/"&gt;post&lt;/a&gt;. (On TeamCity 5.1, you don't have to worry with the assembly renaming.) The rest comes here:&lt;/p&gt;  &lt;h5&gt;Problem: Sometimes you see no results at all&lt;/h5&gt;  &lt;p&gt;Maybe there are many reasons that can cause this, but for me the problem was an x86/x64 issue. On an x64 build controller, you have to make sure that the test execution and the coverage are all running with the same processor architecture. I've achieved success with x86 compilation only, with x64 I always encountered a &amp;quot;...\tmpE1BE.tmp exited with code -1&amp;quot; error. But I did not play with this so much. These are my working settings:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/TJe1B6qdaKI/AAAAAAAAB7I/99-Yd_YRClQ/s1600-h/teamcity_partcover_settings%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="teamcity_partcover_settings" border="0" alt="teamcity_partcover_settings" src="http://lh5.ggpht.com/_BvHWk-52Bdk/TJe1CcsAm9I/AAAAAAAAB7M/H6KWDwhYwT4/teamcity_partcover_settings_thumb%5B3%5D.png?imgmax=800" width="362" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Problem: The reports provided with PartCover don't work with TeamCity&lt;/h5&gt;  &lt;p&gt;You can find fixes for the reports in stackoverflow and also on Jeremy's post, but altogether these reports are not too detailed, e.g. they don't go into method level. Without knowing which method causes the low class coverage, the numbers are not too helpful (except for your boss). So this leads me to the third problem...&lt;/p&gt;  &lt;h5&gt;Problem: There is no detailed HTML report available&lt;/h5&gt;  &lt;p&gt;As I have mentioned above, this was quite a pain for me. So I&amp;#160; refreshed my old XSLT skills (again) and tried to put together a report that shows what I need:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;global &amp;amp; assembly-level summary &lt;/li&gt;    &lt;li&gt;top 10 uncovered method &lt;/li&gt;    &lt;li&gt;detailed method-level report with source code line numbers (it is not possible to embed the source code file from XSLT unfortunately) &lt;/li&gt;    &lt;li&gt;coverage values excluding the very simple members (simple property get/set, empty constructor, etc.) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The detailed report (for a small solution): &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BvHWk-52Bdk/TJdAQ0A_JoI/AAAAAAAAB64/gS1mjHKPVww/s1600/partcover_report_full.png"&gt;&lt;img style="border-right-width: 0px; width: 400px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; height: 396px; margin-left: auto; border-left-width: 0px; cursor: pointer; margin-right: auto" id="BLOGGER_PHOTO_ID_5518950525950699138" border="0" alt="" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/TJdAQ0A_JoI/AAAAAAAAB64/gS1mjHKPVww/s400/partcover_report_full.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Class details with method-level numbers:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BvHWk-52Bdk/TJdBIr1uc3I/AAAAAAAAB7A/Nyp-r7h3Skc/s1600/partcover_report_method_details.png"&gt;&lt;img style="width: 400px; display: block; float: none; height: 143px; margin-left: auto; cursor: pointer; margin-right: auto" id="BLOGGER_PHOTO_ID_5518951485828658034" border="0" alt="" src="http://2.bp.blogspot.com/_BvHWk-52Bdk/TJdBIr1uc3I/AAAAAAAAB7A/Nyp-r7h3Skc/s400/partcover_report_method_details.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;How to setup the detailed report&lt;/h5&gt;  &lt;ol&gt;   &lt;li&gt;download the XSLT from here: &lt;a href="http://dl.dropbox.com/u/51289/BlogAttachments/PartCoverFullReport.xslt" target="_blank"&gt;PartCoverFullReport.xslt&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;copy the XSLT file in the &amp;quot;xslt&amp;quot; folder of PartCover on the build controller(s) (e.g.: C:\Program Files\PartCover\PartCover .NET 4.0\xslt) &lt;/li&gt;    &lt;li&gt;in the build configuration, specify the &amp;quot;Report XSLT&amp;quot; field as:C:\Program Files\PartCover\PartCover .NET 4.0\xslt\PartCoverFullReport.xslt=&amp;gt;index.html &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-2610575006285796728?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/IRy6UMxXDCA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/2610575006285796728/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=2610575006285796728" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2610575006285796728?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2610575006285796728?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/IRy6UMxXDCA/detailed-report-for-partcover-in.html" title="Detailed Report for PartCover in TeamCity 5.1" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_BvHWk-52Bdk/TJe1CcsAm9I/AAAAAAAAB7M/H6KWDwhYwT4/s72-c/teamcity_partcover_settings_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2010/09/detailed-report-for-partcover-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AFRHw8fCp7ImA9WxFXEU8.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-1022952076439236601</id><published>2010-05-17T20:41:00.001+02:00</published><updated>2010-05-17T20:41:55.274+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T20:41:55.274+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Progressive .NET Tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="Skills Matter" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>SpecFlow Workshop at Skills Matter / Progressive.NET Tutorials</title><content type="html">&lt;p&gt;Luckily escaping the &lt;a href="http://news.bbc.co.uk/2/hi/business/10105863.stm"&gt;BA strike&lt;/a&gt; and the newest &lt;a href="http://news.bbc.co.uk/2/hi/in_depth/europe/2010/iceland_volcano/default.stm"&gt;volcano ash cloud&lt;/a&gt;, on Friday I safely arrived home from the &lt;a href="http://skillsmatter.com/event/open-source-dot-net/progressive-dotnet-tutorials-2010"&gt;Skills Matter Progressive.NET Tutorials&lt;/a&gt; in London.&lt;/p&gt;  &lt;p&gt;This was the first time I visited this event and it was a great honor that &lt;a href="http://blog.jonasbandi.net/"&gt;Jonas&lt;/a&gt; and me had been invited to do two workshops about behavior-driven development (BDD) and &lt;a href="http://www.specflow.org"&gt;SpecFlow&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I enjoyed the event very much. I also visited a lot of interesting tracks, but maybe the best was to meet so many enthusiastic and “progressive” developers. It helped me a lot to charge my batteries - to keep on thinking about new ideas and improvements in the development process and technologies.&lt;/p&gt;  &lt;p&gt;Chris has written a &lt;a href="http://chrishassa.wordpress.com/2010/05/16/bddwithspecflowatskillsmatter/"&gt;short summary&lt;/a&gt; on our sessions, I don’t want to repeat him. I was very pleased that we got so much interest and positive feedback after the sessions. It was a pleasure to work with Jonas and thanks also for &lt;a href="http://www.techtalk.at"&gt;TechTalk&lt;/a&gt;’s support.&lt;/p&gt;  &lt;p&gt;Let me highlight only two things about the BDD session.&lt;/p&gt;  &lt;p&gt;The best part in it (again) was the acceptance criteria writing task, where the attendees had to write 2-3 (the most important) acceptance criteria about the shopping cart feature of a book shop application. The goal of the exercise was to discuss good/bad practices and patterns in formulating scenarios. We thought that the best way to learn these was to learn them on the basis of personal experience. But as we can never guarantee that the attendees will really make those mistakes that we would like to highlight, this is always risky. But it worked again! We didn’t have to show any prepared solution (to be honest we didn’t prepare any), we could explain and discuss a lot of interesting things through the samples the attendees came up with. It was amazing!&lt;/p&gt;  &lt;p&gt;In the beginning of the workshop where we wanted to collect possible hopes and fears about BDD to be addresses during the sessions, we had another task as well. Usually we do this with yellow stickers but this time we made a last minute adaption to our process – making the session “progressive”… Instead of stickers, now we used a twitter – everyone could post comments with the term &lt;a href="http://twitter.com/#search?q=%23prognetbdd"&gt;#prognetbdd&lt;/a&gt; that we displayed on the projector and discussed. It was a fun!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-1022952076439236601?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/tpD2QBn1mmE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/1022952076439236601/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=1022952076439236601" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/1022952076439236601?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/1022952076439236601?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/tpD2QBn1mmE/specflow-workshop-at-skills-matter.html" title="SpecFlow Workshop at Skills Matter / Progressive.NET Tutorials" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2010/05/specflow-workshop-at-skills-matter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYNQ3w8eCp7ImA9WxNWGUo.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-5382689288744802407</id><published>2009-10-19T20:04:00.001+02:00</published><updated>2009-10-19T20:33:12.270+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T20:33:12.270+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><title>SpecFlow: Pragmatic BDD for .NET</title><content type="html">&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="SpecFlow icon" border="0" alt="SpecFlow icon" align="right" src="http://lh3.ggpht.com/_BvHWk-52Bdk/StyqQF8a1jI/AAAAAAAAA0I/0sU6ozpp6oY/image11.png?imgmax=800" width="200" height="74" /&gt; Last year I worked a lot on finding better techniques for automated functional testing. &lt;/p&gt;  &lt;p&gt;I was investigating topics like how to solve problems of automated web UI testing (especially ASP.NET), how to structure automated functional tests or how to ensure the preconditions of functional tests. We even created small tools to support this, but altogether it was not a big success. &lt;/p&gt;  &lt;p&gt;Finally, we started to use &lt;a href="http://cukes.info/" target="_blank"&gt;cucumber&lt;/a&gt; and this was the first tool where I felt that it supported the concept we need. However, we had some issues with cucumber, too:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Using it with .NET projects (through IronRuby) was quite slow, and since the IronRuby documentation is not too detailed, we continually encountered ruby/.net conversion issues that were hard to debug and solve. &lt;/li&gt;    &lt;li&gt;We had our continuous build infrastructure, but it was not prepared for running cucumber tests. &lt;/li&gt;    &lt;li&gt;The development team did not have sufficient ruby knowledge. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Considering these problems, we finally decided to move forward: to implement a small .NET running environment for cucumber, where the step definitions are written in .NET. Since I’ve gathered quite a lot of experience with Visual Studio SDK, I came to the idea to implement this tool as a single-file generator that generates NUnit test fixture files from the cucumber file, which can be executed by NUnit runner, also on the build server, without extra configuration. &lt;/p&gt;  &lt;p&gt;We resolved to implement the bindings as .NET methods, having [Given], [When] or [Then] attributes.&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;[Given(&lt;span style="color: #006080"&gt;&amp;quot;I have entered (.*) into the calculator&amp;quot;&lt;/span&gt;)]       &lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; GivenIHaveEnteredANrIntoTheCalculator(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; nr)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;//...&lt;/span&gt;       &lt;br /&gt;}       &lt;br /&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The tool contains a runtime part as well that finds the matching step definition method during the test executions and executes them. The first implementation used an Oslo parser, but finally we had to rewrite it to use &lt;a href="http://www.antlr.org/" target="_blank"&gt;ANTRL&lt;/a&gt;, because of performance issues.&lt;/p&gt;  &lt;p&gt;The tool worked surprisingly well and we started to use it in a project where we had our cucumber tests already; we just had to rewrite the step definitions to .NET, since the cucumber files were compatible. &lt;/p&gt;  &lt;p&gt;In the meanwhile, TechTalk decided to make an open-source project out of the in-house tool. But life is not easy, we have quickly realized that the names we have used so far (“NCucumber” or “Cucumber for .NET”) cannot really be used as a “trademark”. The cucumber team – somehow understandable – wanted to keep the name “cucumber” for products which are direct ports of cucumber. Although we are compatible in the cucumber file (&lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin" target="_blank"&gt;gherkin&lt;/a&gt;) level, we don’t have an own execution environment (NUnit does it for us). So we have chosen the new name: &lt;a href="http://www.specflow.org/" target="_blank"&gt;SpecFlow&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The first version of SpecFlow is already available, so you can try it out (the source-code is also coming next week). To learn more, visit the website:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.specflow.org"&gt;http://www.specflow.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/StyqQ2iQvVI/AAAAAAAAA0M/GeoQgjlktwU/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="specflow test execution" border="0" alt="specflow test execution" src="http://lh5.ggpht.com/_BvHWk-52Bdk/StyqRY6TsQI/AAAAAAAAA0U/7b88mjbNARU/image_thumb1.png?imgmax=800" width="444" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-5382689288744802407?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/6s7LclUW2Fc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/5382689288744802407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=5382689288744802407" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/5382689288744802407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/5382689288744802407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/6s7LclUW2Fc/specflow-pragmatic-bdd-for-net.html" title="SpecFlow: Pragmatic BDD for .NET" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_BvHWk-52Bdk/StyqQF8a1jI/AAAAAAAAA0I/0sU6ozpp6oY/s72-c/image11.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/10/specflow-pragmatic-bdd-for-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4MQ3gzeCp7ImA9WxNWFko.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-3895956417878440188</id><published>2009-10-15T20:27:00.002+02:00</published><updated>2009-10-16T09:09:42.680+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-16T09:09:42.680+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="DevCamp" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="SpecFlow" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>DevCamp09: Behavior Driven Development Applied in Unit Testing</title><content type="html">&lt;p&gt;&lt;img style="border-width: 0px; display: inline; margin-left: 0px; margin-right: 0px;" title="Session startup slide" alt="Session startup slide" src="http://lh4.ggpht.com/_BvHWk-52Bdk/StdpcjZeQ-I/AAAAAAAAAzU/WNr1xmiGGN8/image20.png?imgmax=800" align="right" border="0" width="244" height="184" /&gt; The presentation material (slides and demo source code) of my &lt;a href="http://www.devcamp.at/2009/Tracks-Sessions/Track-3-400.aspx" target="_blank"&gt;DevCamp09&lt;/a&gt; presentation are on-line now and can be downloaded from the TechTalk website &lt;a href="http://www.techtalk.at/getdoc/29344457-7293-4378-beeb-69d288c02397/Presentation-Downloads.aspx" target="_blank"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The downloadable material also contains the framework that can be used to write BDD-style unit tests. This framework will most probably be joined to &lt;a href="http://www.specflow.org/" target="_blank"&gt;SpecFlow&lt;/a&gt;, the open-source BDD tool we have just launched (hence, the new namespace, &lt;em&gt;TechTalk.SpecFlow.UnitTesting&lt;/em&gt;).&lt;/p&gt;  &lt;h5&gt;Session Abstract&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Developer life was good in the golden age of the waterfall: big upfront designs left no surprises for later implementation, code documentation was a piece of cake as nobody else read it anyway, and testing was something developers just heard of remotely through a department called “QA”.&lt;/em&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/StdpdOOLWYI/AAAAAAAAAzY/cyi3shhvE9E/s1600-h/image19.png"&gt;&lt;em&gt;&lt;img style="border-width: 0px; display: inline; margin-left: 0px; margin-right: 0px;" title="The &amp;quot;Golden Age&amp;quot;" alt="The &amp;quot;Golden Age&amp;quot;" src="http://lh3.ggpht.com/_BvHWk-52Bdk/StdpdjDNRAI/AAAAAAAAAzc/AzIJvZsGPUw/image_thumb6.png?imgmax=800" align="right" border="0" width="244" height="184" /&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;But things have changed for the worse with the rise of agile methodologies: designs are ruined by requirements coming in weekly and code that was already working perfectly suddenly breaks. Now, business wants to collaborate directly and is interested in details of the implementation, meaning that documentation can no longer be kept on the back burner. And QA is asking for a high coverage of unit tests out of the blue, causing big overheads to write and maintain them with all these ongoing changes.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;However, a lot of concepts have been introduced that promise to ease the pain: IoC helps us reduce dependencies in the code, BDD helps us focus on the next functionality to deliver, TDD helps us structure code for testability and Fluent Interfaces are a way of building DSLs that help us communicate with business.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;This talk will show how we put these concepts into practice in a project that followed an agile methodology. We’ll show how IoC helped us stay flexible, and how we structured our unit tests in a way that described the expected behavior and could also be understood by business. The source code of the supporting infrastructure we built will be made available to you after the talk as a download.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;Screenshots from the demo&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/StdpeK28PKI/AAAAAAAAAzg/na9jv5Ixlb4/s1600-h/image22.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh4.ggpht.com/_BvHWk-52Bdk/StdpeR3_J-I/AAAAAAAAAzk/G5Laf4-bNyA/image_thumb11.png?imgmax=800" border="0" width="444" height="282" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;Execution result of a very simple BDD-style unit test &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/StdpfIMDqMI/AAAAAAAAAzo/cBWEYFHIV_4/s1600-h/image23.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh5.ggpht.com/_BvHWk-52Bdk/Stdpfq-r2jI/AAAAAAAAAzs/Ldgcz_nwmiM/image_thumb12.png?imgmax=800" border="0" width="444" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;…and the unit test itself&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_BvHWk-52Bdk/StdpgJK8ThI/AAAAAAAAAzw/2y1CidvYpWg/s1600-h/image25.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh3.ggpht.com/_BvHWk-52Bdk/Stdpgu4dcRI/AAAAAAAAAz0/_JkNbFcBTfs/image_thumb14.png?imgmax=800" border="0" width="444" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;Execution result of a more complex BDD-style unit test &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_BvHWk-52Bdk/StdphMPxEDI/AAAAAAAAAz4/ZAosQp8DILI/s1600-h/image26.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh3.ggpht.com/_BvHWk-52Bdk/StdphsQ5jGI/AAAAAAAAAz8/7hvayVi-0Tc/image_thumb15.png?imgmax=800" border="0" width="444" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;…the unit test…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/StdpiDNCgyI/AAAAAAAAA0A/TRcg-DcU72c/s1600-h/image27.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="image" alt="image" src="http://lh5.ggpht.com/_BvHWk-52Bdk/StdpirLHldI/AAAAAAAAA0E/8TYoHHN53EU/image_thumb16.png?imgmax=800" border="0" width="444" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;…and finally the implemented code&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-3895956417878440188?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/TbE9r3Jy7AQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/3895956417878440188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=3895956417878440188" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3895956417878440188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3895956417878440188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/TbE9r3Jy7AQ/devcamp09-behavior-driven-development.html" title="DevCamp09: Behavior Driven Development Applied in Unit Testing" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_BvHWk-52Bdk/StdpcjZeQ-I/AAAAAAAAAzU/WNr1xmiGGN8/s72-c/image20.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/10/devcamp09-behavior-driven-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8HQHY8eSp7ImA9WxJTEkk.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-2977095715980336183</id><published>2009-04-20T19:17:00.001+02:00</published><updated>2009-04-20T19:17:11.871+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T19:17:11.871+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="developer" /><title>Doing it right</title><content type="html">&lt;p&gt;I’m a software developer. From time to time, I come to the question why it is good to be a developer? Why is it good to write software?&lt;/p&gt;  &lt;p&gt;I don’t have the ultimate answer yet, but I already have a few: making someone's work easier; to able to get out more value from the things we know; because it is a joy for me; because I can teach other developers to find this joy; or simply because it provides a reasonable good salary. (I always pick the one that fits best to my mood, but honestly I can also argue with each of them.)&lt;/p&gt;  &lt;p&gt;I’m not working on software that saves lives directly, and there was a time when I was very sad about that. But then I have realized that the world is full of people that also don’t do that, still you can be very happy that they do what they are doing. (Now I cut the long list of examples, because I tend to be too sentimental.) The point is that you are happy with them because they do their job &lt;em&gt;right&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Today I have found the website of the &lt;a href="http://www.ted.com" target="_blank"&gt;TED&lt;/a&gt; community. TED stands for Technology, Entertainment, Design, and it is a community (and a yearly conference) where people try to bring these concepts together and make something remarkable. It is innovative, but not necessarily technology-wise. And very-very inspiring. The best talks from the conferences are also available on-line, so you should better look at them. They are all relatively short (the allowed time for a speech is 18 minutes).&lt;/p&gt;  &lt;p&gt;Why does this come here? Because sometimes you have to step back and look at things from a broader perspective in order to step further or gather new ideas. Here are some:&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;a href="http://www.ted.com/index.php/talks/matthew_childs_9_rules_of_rock_climbing.html" target="_blank"&gt;Matthew Childs: Hang in there! 9 life lessons from rock climbing&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;You will start listening to this as it would be about rock climbing, but you’ll soon realize that this is also about you (and for example software development). (04:48)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ted.com/index.php/talks/scott_mccloud_on_comics.html" target="_blank"&gt;Scott McCloud: Understanding comics&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you’ve guessed this is also about more than comics. It is about vision and about finding ways to understand things (take it apart and put it together). About how technology and art can cooperate with each-other. (In this sense, it can be also helpful for software usability.) And last but not least to show how to make a &lt;a href="http://www.claudioperrone.com/blog/articles/2008/08/11/crafting-memorable-technical-presentations/" target="_blank"&gt;memorable presentation&lt;/a&gt;. (17:08)&lt;/p&gt;  &lt;p&gt;In McCloud’s talk, there is an interesting list of rules which I have to think of:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Learn from everyone &lt;/li&gt;    &lt;li&gt;Follow no one &lt;/li&gt;    &lt;li&gt;Watch for patterns &lt;/li&gt;    &lt;li&gt;Work like hell &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span&gt;I have learned a lot today.&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-2977095715980336183?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/clRz4n2wNWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/2977095715980336183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=2977095715980336183" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2977095715980336183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2977095715980336183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/clRz4n2wNWU/doing-it-right.html" title="Doing it right" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/04/doing-it-right.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkINRX87cCp7ImA9WxVUE0o.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-4054881282305233628</id><published>2009-03-18T12:09:00.001+01:00</published><updated>2009-03-18T12:09:54.108+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-18T12:09:54.108+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL2008" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Scripting database including data in SQL Server 2008 Management Studio</title><content type="html">&lt;p&gt;I was always missing a function in the management studio of the different SQL Server versions. This was to generate a script from an existing database, that also contains the INSERT statements for the existing data in the tables.&lt;/p&gt;  &lt;p&gt;Today I have found out, that there is already such a feature in the Management Studio of SQL 2008, although it is not so easy to find it.&lt;/p&gt;  &lt;p&gt;Actually it is very simple. You only have to use the “Generate Scripts” wizard, and on the options step, you have to enable the “Script Data” option somewhere at the end of that long list.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/ScDWfGORHVI/AAAAAAAAAkY/arzm3k0Bml4/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="wizard options" border="0" alt="wizard options" src="http://lh5.ggpht.com/_BvHWk-52Bdk/ScDWfjqSl2I/AAAAAAAAAkc/DhdJbW6eAf0/image_thumb%5B4%5D.png?imgmax=800" width="440" height="398" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-4054881282305233628?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/LkXzzWP3C-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/4054881282305233628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=4054881282305233628" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4054881282305233628?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4054881282305233628?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/LkXzzWP3C-0/scripting-database-including-data-in.html" title="Scripting database including data in SQL Server 2008 Management Studio" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_BvHWk-52Bdk/ScDWfjqSl2I/AAAAAAAAAkc/DhdJbW6eAf0/s72-c/image_thumb%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/03/scripting-database-including-data-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEARn45fip7ImA9WxVREkU.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-4690421269593859467</id><published>2009-01-18T15:24:00.001+01:00</published><updated>2009-01-18T15:24:07.026+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-18T15:24:07.026+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>Enable WCF hosing in IIS 7</title><content type="html">&lt;p&gt;As I was &lt;a href="http://gasparnagy.blogspot.com/2009/01/windows-7-and-developing-wcf.html"&gt;playing with WCF services on Windows 7&lt;/a&gt;, I had to set up IIS to host a WCF service. It turned out that it is not as straightforward as I expected. Here is a small summary about the steps that you have to do. (I have found a &lt;a href="http://www.thinkingms.com/pandurang/CommentView,guid,f18a7f4b-c0c5-4f6f-8a30-197368018560.aspx"&gt;post&lt;/a&gt; of Pandurang Nayak that describes these steps, but that article is not available currently, only through Live Search &lt;a href="http://cc.msnscache.com/cache.aspx?q=how+to+enable+wcf+service+host+in+iis+7+%22windows+7%22&amp;amp;d=75263145674327&amp;amp;mkt=hu-HU&amp;amp;setlang=hu-HU&amp;amp;w=7596f01a,2374cc0a"&gt;cache&lt;/a&gt;).&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Don’t forget to install IIS… :) Yes, it took me some time to realize that it is not installed by default. &lt;/li&gt;    &lt;li&gt;When you install IIS (Contol Panel / Programs / Turn Windows features on or off), the sub-components selected by default are not enough. You need at least the Windows authentication, the IIS 6 Management Compatibility (for Visual Studio) and probably some more, but I gave up playing with the sub-components and finally selected all.      &lt;br /&gt;Don’t forget to restart your machine. Although you are not asked to do that, for me it did not work.       &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/SXM7cwSEjxI/AAAAAAAAAi4/iNFuulR_uIQ/s1600-h/image15.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7d4jjXUI/AAAAAAAAAi8/UW_bbzxgdUo/image_thumb11.png?imgmax=800" width="382" height="459" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Still in the “Turn Windows features on or off” dialog, you have to enable sub components of .NET 3.5: &lt;em&gt;WCF HTTP and Non-HTTP Activation&lt;/em&gt;. (Did you know that you can do such things here?)       &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7eIDWU9I/AAAAAAAAAjA/T5tV0FNOR8Y/s1600-h/image20.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7e47n0hI/AAAAAAAAAjE/FMiEkxr_6jc/image_thumb14.png?imgmax=800" width="382" height="81" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;As I have installed IIS after installing Visual Studio 2008, I had to register the ASP.NET components for IIS by executing &lt;em&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe –i&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Finally you have to register WCF as well for IIS (to understand the .svc extension for example). You can do it by executing &lt;em&gt;C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe –i&lt;/em&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If you have followed these steps (plus maybe a few more restart) you will be able to host WCF services on IIS 7. &lt;/p&gt;  &lt;p&gt;Visual Studio 2008 can help you to configure and debug the virtual directory for you, but for this feature you have to run Visual Studio as administrator.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/SXM7fU-C-tI/AAAAAAAAAjI/xtpdzL_kn-I/s1600-h/image25.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7f-d3qpI/AAAAAAAAAjM/g8F3U3t8XMg/image_thumb17.png?imgmax=800" width="442" height="222" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;But fortunately there is an informative error message if you forget to do so.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7g7GvPrI/AAAAAAAAAjQ/m4J-TC9Qe3A/s1600-h/image32.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_BvHWk-52Bdk/SXM7hsgbjiI/AAAAAAAAAjU/wOhEZ7ZHvdY/image_thumb22.png?imgmax=800" width="440" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-4690421269593859467?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/588XLqIamlw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/4690421269593859467/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=4690421269593859467" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4690421269593859467?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/4690421269593859467?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/588XLqIamlw/enable-wcf-hosing-in-iis-7.html" title="Enable WCF hosing in IIS 7" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_BvHWk-52Bdk/SXM7d4jjXUI/AAAAAAAAAi8/UW_bbzxgdUo/s72-c/image_thumb11.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/01/enable-wcf-hosing-in-iis-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIERn07fCp7ImA9WxVUEUU.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-756680161530365184</id><published>2009-01-15T15:05:00.001+01:00</published><updated>2009-03-16T08:28:27.304+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T08:28:27.304+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>Windows 7 and developing WCF applications</title><content type="html">&lt;p&gt;Yes, I know that this is weird, but I have installed Windows 7 to my development notebook to see how it survives. (Ok, I have a backup XP as well on the machine.)&lt;/p&gt;  &lt;p&gt;Generally it works very well, I have not found any major problem with Windows 7, and it seems that the stability has been improved a lot since the pre-beta.&lt;/p&gt;  &lt;p&gt;The only problem I have encountered so far is with WCF service applications. If I create a WCF service and host it on the ASP.NET Development server, then all of the WCF requests return an HTTP error:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The remote server returned an unexpected response: (400) Bad Request.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_BvHWk-52Bdk/SW9CuydowKI/AAAAAAAAAiw/wFfLLi_s9lw/s1600-h/image%5B23%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WCF Test Client error dialog" border="0" alt="WCF Test Client error dialog" src="http://lh4.ggpht.com/_BvHWk-52Bdk/SW9Cvb9vryI/AAAAAAAAAi0/wfWMmv6Nb14/image_thumb%5B19%5D.png?imgmax=800" width="442" height="228" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This can even be reproduced with the simplest WCF service that is created for example with the “WCF Service Application” project template.&lt;/p&gt;  &lt;p&gt;It is also interesting that the service serves the WSDL request well, it just produces the error when you call a service method. With IIS (after I was able to set it up) the service worked fine.&lt;/p&gt;  &lt;p&gt;I have no idea currently what can cause this behavior, but it can be reproduced on other Windows 7 machines as well.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Update: &lt;/em&gt;It's a known security-related issue with Cassini in Windows 7 beta build 7000 and will be fixed in next release. (see &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/123f0d20-a018-48b0-ab92-4aae749f2d5e/"&gt;http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/123f0d20-a018-48b0-ab92-4aae749f2d5e/&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Thanks to Johan for the update (&lt;a href="http://weblogs.asp.net/jdanforth/archive/2009/03/14/bad-request-with-wcf-service-in-cassini-on-windows-7-beta.aspx"&gt;http://weblogs.asp.net/jdanforth/archive/2009/03/14/bad-request-with-wcf-service-in-cassini-on-windows-7-beta.aspx&lt;/a&gt;).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-756680161530365184?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/PWM5l9y8R9s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/756680161530365184/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=756680161530365184" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/756680161530365184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/756680161530365184?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/PWM5l9y8R9s/windows-7-and-developing-wcf.html" title="Windows 7 and developing WCF applications" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_BvHWk-52Bdk/SW9Cvb9vryI/AAAAAAAAAi0/wfWMmv6Nb14/s72-c/image_thumb%5B19%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/01/windows-7-and-developing-wcf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cBRHw-fCp7ImA9WxVSGEg.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-8229924707717781623</id><published>2009-01-13T10:24:00.003+01:00</published><updated>2009-01-13T16:04:15.254+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T16:04:15.254+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio 2008" /><category scheme="http://www.blogger.com/atom/ns#" term="Oracle" /><title>OracleClient problem in .NET 2.0 SP2 (comes with VS2008 SP1)</title><content type="html">&lt;p&gt;As mentioned in &lt;a href="http://www.hanselman.com/blog/UpdateOnNETFramework35SP1AndWindowsUpdate.aspx"&gt;a lot of sources&lt;/a&gt;, Visual Studio 2008 SP1, in spite of its name, also contains service packs for the .NET core components. Namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;.NET 2.0 SP2 &lt;/li&gt;    &lt;li&gt;.NET 3.0 SP2 &lt;/li&gt;    &lt;li&gt;.NET 3.5 SP1 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfortunately there is not too much information available what these components contain, but it seems that they may seriously affect applications that were running perfectly before.&lt;/p&gt;  &lt;p&gt;It seems for example that .NET 2.0 SP2 contains a change in the System.Data.OracleClient assembly that may break applications using an Oracle database. &lt;/p&gt;  &lt;p&gt;The most visible result of the issue is that LOB handling fails with the exception:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Modifying a LOB requires that the connection be transacted.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Although this issue causes breaks in applications, there are even more dangerous effects of the bug. The transactions may automatically switch “Auto-commit” mode that can produce inconsistent and corrupt data in the database even without any visible error. More details &lt;a href="http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/d4834ce2-482f-40ec-ad90-c3f9c9c4d4b1/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In December, Microsoft released an update to the .NET Framework service packs: &lt;a href="http://support.microsoft.com/?kbid=959209"&gt;KB959209&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Funnily, Microsoft has not stopped confusing developers with the updates. Although the title of the update is “&lt;em&gt;Microsoft .NET Framework 3.5 Family Update&lt;/em&gt;”, it contains updates for .NET 2.0 SP2, .NET 3.0 SP2 and .NET 3.5 SP1. You can install these updates individually. (To resolve the Oracle issue, it is enough to install the fix for .NET 2.0 SP2.)&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Update: &lt;/em&gt;It seems that the update can be installed only to English .NET frameworks. Other language versions (e.g. German) can be also found at Microsoft Download Center (although it is not so easy). Here are the most common download links for German .NET frameworks:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=6C095BBA-6100-4EC9-9C54-6450B0212565&amp;amp;displaylang=de"&gt;XP x86, Windows Server 2003 x86 – Deutsch&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=A4F52459-DFE5-4BC3-8F7F-AA688879B1DC&amp;amp;displaylang=de"&gt;XP x64, Windows Server 2003 x64 – Deutsch&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=B9DE7937-2C12-4F16-AD66-A31B83931953&amp;amp;amp;displaylang=en&amp;amp;displaylang=de"&gt;Vista x86, Windows Server 2008 x86 – Deutsch&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=98E83614-C30A-4B75-9E05-0A9C3FBDD20D&amp;amp;displaylang=de"&gt;Vista x64, Windows Server 2008 x64 - Deutsch&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-8229924707717781623?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/Pe-iZUH2x6w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/8229924707717781623/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=8229924707717781623" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/8229924707717781623?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/8229924707717781623?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/Pe-iZUH2x6w/oracleclient-problem-in-net-20-sp2.html" title="OracleClient problem in .NET 2.0 SP2 (comes with VS2008 SP1)" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/01/oracleclient-problem-in-net-20-sp2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBSH4zeCp7ImA9WxVSE04.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-2593216208599234295</id><published>2009-01-07T13:57:00.001+01:00</published><updated>2009-01-07T13:57:39.080+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-07T13:57:39.080+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>WCF Security Guidance</title><content type="html">&lt;p&gt;Probably it is well known, but I've only found it now:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/WCFSecurityGuide"&gt;patterns &amp;amp; practices: WCF Security Guidance Project&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It is a complete book about WCF security on-line (you can download it or just browse through it). With its scenario-based approach and the practical samples and &amp;quot;how-to&amp;quot; chapters it seems to be very useful.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-2593216208599234295?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/UhSXmvcnNxo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/2593216208599234295/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=2593216208599234295" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2593216208599234295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/2593216208599234295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/UhSXmvcnNxo/wcf-security-guidance.html" title="WCF Security Guidance" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2009/01/wcf-security-guidance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MNR34zeip7ImA9WxRaFE4.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-3539882930843847102</id><published>2008-12-16T13:44:00.001+01:00</published><updated>2008-12-16T13:44:56.082+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-16T13:44:56.082+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio 2010" /><title>Visual Studio 2010 - Historical Debugger</title><content type="html">&lt;p&gt;I've played a little bit with Visual Studio 2010, trying out the automated web UI tests, but I have found a feature that became quickly my favorite from the VS20010 feature list. This is the historical debugger.&lt;/p&gt;  &lt;p&gt;The idea is easy: the IDE collects and stores information about the debugged application (important events, called methods, parameters, (handled) exceptions, etc.) that allows you later to jump back in time, and check what happened before you have actually run into a problem that you want to fix. You can walk through the execution steps and review when the things went wrong. (The experience is a little bit similar like the call stack window, but here you are not constrained to the callers and you can get much more information about the executed methods.)&lt;/p&gt;  &lt;p&gt;Of course nothing is for free, the application will be slower with this historical debugger, but MS addressed this problem, and you can fine-tune the information to be collected (or even switch it off), and you can also limit the size of the collected data (it always keeps the last part of it, so when you break the execution the information that is relevant to the experienced problem will be most likely still available).&lt;/p&gt;  &lt;p&gt;You can see a nice screencast about this new feature by &lt;a href="http://channel9.msdn.com/posts/VisualStudio/Historical-Debugger-and-Test-Impact-Analysis-in-Visual-Studio-Team-System-2010/"&gt;Habib Heydarian&lt;/a&gt; and also some screenshots from &lt;a href="http://pavkata.blogspot.com/2008/10/visual-studio-2010-2-historical.html"&gt;Pavel Nikolov&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-3539882930843847102?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/FxM4MSb8oaU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/3539882930843847102/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=3539882930843847102" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3539882930843847102?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/3539882930843847102?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/FxM4MSb8oaU/visual-studio-2010-historical-debugger.html" title="Visual Studio 2010 - Historical Debugger" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2008/12/visual-studio-2010-historical-debugger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAHR3s8eyp7ImA9WxRbGU8.&quot;"><id>tag:blogger.com,1999:blog-1476266168103550856.post-8590097373902813926</id><published>2008-12-10T13:10:00.000+01:00</published><updated>2008-12-10T17:48:56.573+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T17:48:56.573+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="EntityFramework" /><title>Entity Framework as an OR/M</title><content type="html">&lt;p&gt;I know that Entity Framework (EF) has a lot of concepts behind the OR/M features, but I think most of the people who try it out just use it as an object-relational mapping tool. And it seems that also the tools around it (designer) are also driving you to this direction. And BTW this is the reason why MS could &lt;a href="http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx"&gt;announce&lt;/a&gt; it a recommended replacement for LINQ to SQL.&lt;/p&gt;  &lt;p&gt;I have also investigated EF from this point (I did a small application with it). Here are my feelings. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: I have used the currently released version of the Entity Framework, as I wanted to see, how it is useable now. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Generally I have been quite productive with EF and I have not encountered any problem that I could not solve. On the other hand, it did not really impress me. It does not really try to be smart, you have to do everything you want explicitly. This seems to be a defined concept that I can accept, but in some cases the default behaviors are not defensive enough, which caused some tricky errors in my application.&lt;/p&gt;  &lt;p&gt;So I have collected some things where IMHO it makes sense to take extra care when writing an application with EF. &lt;/p&gt;  &lt;h5&gt;Designer&lt;/h5&gt;  &lt;p&gt;I think in a larger project the designer will be the first problematic point. As normally the model is modified by multiple developers, I already see the nasty merging issues that you can run into. But even for a single developer, it is very hard to have an overview of your domain model in a single screen, where only 6-8 entities can fit nicely. &lt;/p&gt;  &lt;p&gt;I also encountered with funny issues with the designer that does not seem to support the code-first approach to extend your domain model. I wanted to create a new entity, so I selected the Add/Entity in the designer. Then I realized that I cannot map it to a table, until I add a table too - which you cannot do from the designer (at least I could not find out how). The new unmapped class, although it was not used in the application yet, broke all other use-cases too, so my application stopped working. So finally I created the table manually in the database and refreshed the model. It still did not work, and after 10 minutes I realized that the refresh also created a new entity with an &amp;quot;1&amp;quot; postfix and mapped the new table to it - but as the designer surface was full, the generated entity was out of the screen (and I did not scroll down). The only thing that I don't understand is why it is allowed to create a new entity from the designer then? And of course the same refers to the new properties created in the designer.&lt;/p&gt;  &lt;h5&gt;Lazy framework&lt;/h5&gt;  &lt;p&gt;From the OR/M functionality my biggest problem was the way how EF handles the unloaded relations. There is no lazy loading, I knew that. But I was very much surprised that if you access a property that is not loaded yet, you don't receive an exception! For references, it returns null, for collections an empty collection. This is a great source for hidden errors, so I decided that I'll consider a line of code like these, simply as a mistake:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;Console.WriteLine(product.Category.Name);     &lt;br /&gt;--      &lt;br /&gt;DoSomething(product.Category)      &lt;br /&gt;--      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; order.Items)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;//...&lt;/span&gt;      &lt;br /&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;These lines properly should look like this:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!product.Category.IsLoaded)      &lt;br /&gt;&amp;#160; product.CategoryReference.Load();      &lt;br /&gt;Console.WriteLine(product.Category.Name);      &lt;br /&gt;--      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!product.Category.IsLoaded)      &lt;br /&gt;&amp;#160; product.CategoryReference.Load();      &lt;br /&gt;DoSomething(product.Category)      &lt;br /&gt;--      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!order.Items.IsLoaded)      &lt;br /&gt;&amp;#160; order.Items.Load();      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; order.Items)      &lt;br /&gt;&amp;#160; &lt;span style="color: #008000"&gt;//...&lt;/span&gt;      &lt;br /&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You say now that this is lazy loading. Ok, you are right, but if you want to be correct and you don't want to have lazy loading (because it is the evil that makes our application wrong), you still have to write:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!product.Category.IsLoaded)      &lt;br /&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProgrammersFaultEx(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #006080"&gt;&amp;quot;Don't you think that this should be loaded, mate?&amp;quot;&lt;/span&gt;);      &lt;br /&gt;Console.WriteLine(product.Category.Name);      &lt;br /&gt;--      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!product.Category.IsLoaded)      &lt;br /&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProgrammersFaultEx(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #006080"&gt;&amp;quot;Please load the category, please, please, please!&amp;quot;&lt;/span&gt;);      &lt;br /&gt;DoSomething(product.Category)      &lt;br /&gt;--      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!order.Items.IsLoaded)      &lt;br /&gt;&amp;#160; &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProgrammersFaultEx(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #006080"&gt;&amp;quot;I told you already, that this wont work!&amp;quot;&lt;/span&gt;);      &lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; order.Items)      &lt;br /&gt;&amp;#160; &lt;span style="color: #008000"&gt;//...&lt;/span&gt;      &lt;br /&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You say now that it is too verbose. And you are actually right.&lt;/p&gt;  &lt;h5&gt;Transactions and query consistency&lt;/h5&gt;  &lt;p&gt;There is a little bit similar problem with the query consistency. The use case is that you write a method that lists some products.&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ListProducts()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; db.Product.Where(p =&amp;gt; p.Color == &lt;span style="color: #006080"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;{0} {1}&amp;quot;&lt;/span&gt;, p.Name, p.Color);      &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This method will work fine until you call it from an update use case, where you already updated a color of a product from blue to red. In this case you might see something like:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;product1 blue     &lt;br /&gt;product2 blue      &lt;br /&gt;product3 &lt;strong&gt;&lt;em&gt;red&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Strange, isn't it? The problem is that the db.SaveChanges(); is only invoked at the end of the transaction, and therefore the database does not know about this change at the time when the method is called. The solution: you have to call the db.SaveChanges() earlier. Clear. But who should do this exactly? The method that updated the color? Just to make sure that methods like ListProducts() work well if they called later? Or should the ListProducts() call it? Just to make sure that it does not depend on pending changes? Or should someone else call it? &lt;/p&gt;  &lt;p&gt;Well, of course this is not an easy question (which is good, if you see this as a reason for salary increase), but the funny thing here is that the OR/M knows that there is a pending product change and that you are about to list products! So why I should care?&lt;/p&gt;  &lt;h5&gt;Collection as a query&lt;/h5&gt;  &lt;p&gt;Sometimes you don't want to populate a collection, but you want to use it as a query for further transformations. If you write&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;order.Items.Where(oi =&amp;gt; oi.Product.Color == &lt;span style="color: #006080"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;this will filter the loaded collection (which is an empty, when you forgot to call Load()). If you want to query the database, you have to write:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;order.Items.&lt;em&gt;&lt;strong&gt;CreateSourceQuery()&lt;/strong&gt;&lt;/em&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .Where(oi =&amp;gt; oi.Product.Color == &lt;span style="color: #006080"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;But this will not contain the items, that are added/removed locally, so you have to call db.SaveChanges(), or check whether it is loaded already, so you end up with:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; collectionToQuery = &lt;em&gt;&lt;strong&gt;order.Items.IsLoaded&lt;/strong&gt;&lt;/em&gt; ?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; order.Items : order.Items.CreateSourceQuery();      &lt;br /&gt;collectionToQuery.Where(oi =&amp;gt; oi.Product.Color == &lt;span style="color: #006080"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;but it does not compile, as order.Items is not queryable... :) So the winner is...&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 0.9em; line-height: 12pt; background-color: #f4f4f4; margin: 2em 0em 1em; padding-left: 0.9em; width: 95%; padding-right: 0.9em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 8pt; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 0.9em"&gt;   &lt;div style="margin: 0em; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; collectionToQuery = order.Items.IsLoaded ?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; order.Items.&lt;em&gt;&lt;strong&gt;AsQueryable()&lt;/strong&gt;&lt;/em&gt; : order.Items.CreateSourceQuery();      &lt;br /&gt;collectionToQuery.Where(oi =&amp;gt; oi.Product.Color == &lt;span style="color: #006080"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;)&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And now you are finished.&lt;/p&gt;  &lt;h5&gt;Small annoying things&lt;/h5&gt;  &lt;p&gt;Of course I've found also some small annoying things. Without too much explanation here is a list:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Single() / SingleOrDefault() does not work in LINQ to Entities. You have to use First() / FirstOrDefault().      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;There is no operator in LINQ to Entities to express the SQL &amp;quot;LIKE&amp;quot;. They suggest to use Contains(), but LIKE can do more!      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;You cannot map custom methods / properties, so you cannot encapsulate parts of the queries, and also you have no chance to solve things like the missing LIKE.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;I have not found a way how to map a database field to an enum property. (You need to write a wrapper property).      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;There are not too many ways to control what is cached in the object context, you can Detach() objects individually or skip loading of a query result.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;If you use the Include() method to add relations to the query load span, you have to specify the expressions to be loaded as string. In the time of lambdas, this is quite ugly IMHO. Also the syntax looks quite strange, if you want to include a collection and a reference in each item in the collection, as you have to write this as: orders.Include(&amp;quot;Items.Product&amp;quot;), although Items is an EntityCollection&amp;lt;OrderItem&amp;gt; that does not have a &amp;quot;Product&amp;quot; property.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;You cannot compare entities in queries, you have to compare the id fields (the id fields should be hidden by the OR/M as much as possible):      &lt;br /&gt;...Where(p =&amp;gt; p.Customer == selectedCustomer)       &lt;br /&gt;causes       &lt;br /&gt;      &lt;p style="margin: 0in; font-family: calibri; font-size: 11pt"&gt;&lt;em&gt;&amp;quot;Unable to create a constant value of type 'Closure type'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.&amp;quot;&lt;/em&gt;&lt;/p&gt; and has to be written as:       &lt;br /&gt;...Where(p =&amp;gt; p.Customer.Id == selectedCustomer.Id)       &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1476266168103550856-8590097373902813926?l=blog.gasparnagy.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gasparnagy/~4/nBAa_eDQXcg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gasparnagy.com/feeds/8590097373902813926/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1476266168103550856&amp;postID=8590097373902813926" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/8590097373902813926?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1476266168103550856/posts/default/8590097373902813926?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/gasparnagy/~3/nBAa_eDQXcg/entity-framework-as-orm.html" title="Entity Framework as an OR/M" /><author><name>Gáspár</name><uri>http://www.blogger.com/profile/03913317482022172511</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://4.bp.blogspot.com/_BvHWk-52Bdk/SS6NzkwdbhI/AAAAAAAAAh0/jRZvKET3Wgs/S220/GN1_140x185.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.gasparnagy.com/2008/12/entity-framework-as-orm.html</feedburner:origLink></entry></feed>

