<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Bolla Blog - All Comments</title><link>http://devlicio.us/blogs/jim_bolla/default.aspx</link><description>I got a fever, and the only cure is more unit tests.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#61616</link><pubDate>Sat, 21 Aug 2010 19:00:38 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61616</guid><dc:creator>Matt Baker</dc:creator><description>&lt;p&gt;So I was thinking about this again for some reason last week and it occurred to me that this could be an extension of continuous testing. &amp;nbsp;There are already systems you can set up that monitor the files in your source tree for changes (like JUnit Max, and I&amp;#39;ve used something in Ruby) and then run all your tests, notifying you if something is broken. &amp;nbsp;Why not commit if all the tests pass? &amp;nbsp;The system already has a state for that anyway. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Either way, I think what scares most people (myself anyway) is corruption of their working copy or the danger of losing their place/work due to changes their VCS client is pulling down without being asked. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Could this also create a lot of noise in your commit logs? &amp;nbsp;Instead of changesets there would effectively be a checkin each time you save a change to a file and the tests pass.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61616" width="1" height="1"&gt;</description></item><item><title>NHibernate 2.0: Changes Overview</title><link>http://devlicio.us/blogs/jim_bolla/archive/2007/12/01/Analyzing-NHibernate.dll-with-NDepend.aspx#42212</link><pubDate>Fri, 05 Sep 2008 04:42:11 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42212</guid><dc:creator>Mirrored Blogs</dc:creator><description>&lt;p&gt;My post .NET Framework 3.5 SP1: Changes Overview on analysis evolution, structure and quality of the&lt;/p&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42212" width="1" height="1"&gt;</description></item><item><title>NHibernate 2.0: Changes Overview</title><link>http://devlicio.us/blogs/jim_bolla/archive/2007/12/01/Analyzing-NHibernate.dll-with-NDepend.aspx#42078</link><pubDate>Tue, 26 Aug 2008 17:45:45 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42078</guid><dc:creator>Community Blogs</dc:creator><description>&lt;p&gt;My post .NET Framework 3.5 SP1: Changes Overview on analysis evolution, structure and quality of the&lt;/p&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42078" width="1" height="1"&gt;</description></item><item><title>NHibernate 2.0: Changes Overview - taccato! trend tracker, cool hunting, new business ideas</title><link>http://devlicio.us/blogs/jim_bolla/archive/2007/12/01/Analyzing-NHibernate.dll-with-NDepend.aspx#42076</link><pubDate>Tue, 26 Aug 2008 17:14:55 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42076</guid><dc:creator>NHibernate 2.0: Changes Overview - taccato! trend tracker, cool hunting, new business ideas</dc:creator><description>&lt;p&gt;Pingback from &amp;nbsp;NHibernate 2.0: Changes Overview - taccato! trend tracker, cool hunting, new business ideas&lt;/p&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42076" width="1" height="1"&gt;</description></item><item><title>NHibernate 2.0: Changes Overview</title><link>http://devlicio.us/blogs/jim_bolla/archive/2007/12/01/Analyzing-NHibernate.dll-with-NDepend.aspx#42074</link><pubDate>Tue, 26 Aug 2008 17:01:07 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42074</guid><dc:creator>Patrick Smacchia [MVP C#]</dc:creator><description>&lt;p&gt;My post .NET Framework 3.5 SP1: Changes Overview on analysis evolution, structure and quality of the&lt;/p&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42074" width="1" height="1"&gt;</description></item><item><title>View to Presenter Communication(转)</title><link>http://devlicio.us/blogs/jim_bolla/archive/2006/10/03/ObservableViewPattern.aspx#41633</link><pubDate>Sat, 02 Aug 2008 11:41:38 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41633</guid><dc:creator>江南白衣</dc:creator><description>&lt;p&gt;Alright, I've purposely hid the View to Presenter communication in my previous posts on Supervising Controller and Passive View because I thought that subject was worthy of its own post. As I see it, there are 2 1/2 basic ways to communicate screen events&lt;/p&gt;
&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41633" width="1" height="1"&gt;</description></item><item><title>re: C# 4.0 Feature Request: "??=" the Lazy load operator...</title><link>http://devlicio.us/blogs/jim_bolla/archive/2007/10/26/c-4-0-feature-request-quot-quot-the-lazy-load-operator.aspx#40046</link><pubDate>Sat, 12 Apr 2008 03:40:24 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40046</guid><dc:creator>AK</dc:creator><description>&lt;p&gt;Dude we are already so close with C# , dont add FLUFF.&lt;/p&gt;
&lt;p&gt;Add STUFF&lt;/p&gt;
&lt;p&gt;return _MYSERVICECLASS ?? (_MYSERVICECLASS = new MyService());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class MyService&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public int Count()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 10;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public partial class Form1 : Form&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MyService _MYSERVICECLASS;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public Form1()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InitializeComponent();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private int GetCount()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return MYSERVICECLASS.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private MyService MYSERVICECLASS&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return _MYSERVICECLASS ?? (_MYSERVICECLASS = new MyService());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private void Form1_Load(object sender, EventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MessageBox.Show(string.Format (&amp;quot;{0} count , &amp;nbsp;service is null {1}&amp;quot;,GetCount(),_MYSERVICECLASS==null &amp;nbsp;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40046" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39968</link><pubDate>Sun, 06 Apr 2008 15:51:09 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39968</guid><dc:creator>Sean Chambers</dc:creator><description>&lt;p&gt;I feel the need to chime in here as well. Interesting ideas but like everyone else I think auto-commit is a very bad idea.&lt;/p&gt;
&lt;p&gt;The last step of the TDD mantra is refactor. Therefore, if an auto-commit is happening every green step, then you never have an opportunity to refactor your tests/code to support the new test. In addition, I write 10-20 tests between commits because &amp;nbsp;one commit from my workstation often includes a set of tests that test a specific portion of the project, but just a single test per commit.&lt;/p&gt;
&lt;p&gt;Some of your ideas are great though, opening your IDE and it automatically getting the most current revision from SC is a good idea, maybe with an alert window in case you don't want the most recent revisions however.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39968" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39936</link><pubDate>Fri, 04 Apr 2008 21:57:04 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39936</guid><dc:creator>Greg Young</dc:creator><description>&lt;p&gt;While this sounds pretty good and reasonable you are asking your development environment to do the equivalent of realizing when you want a beer and walking over to the kitchen to bring you one.&lt;/p&gt;
&lt;p&gt;btw: commit on tests pass only works if I write tests first ;-)&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39936" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39934</link><pubDate>Fri, 04 Apr 2008 18:21:18 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39934</guid><dc:creator>keith</dc:creator><description>&lt;p&gt;&amp;quot;The other scenario is when Dev A and Dev B are editing the same block of code, which leads to merge conflicts. In this scenario &amp;quot;CIVCS&amp;quot; wound't be able to not automerge the changes but instead could indicate the merge conflict by putting a &amp;quot;merge confilct&amp;quot; icon in the gutter to the left of the relevant lines of code.&amp;quot;&lt;/p&gt;
&lt;p&gt;but then i'm forced to resolve the conflict _now_ instead of when i'm ready to (when my code is finished and ready, by my definition of ready, for integration)&lt;/p&gt;
&lt;p&gt;disruption and context switches lower productivity substantially, on average.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39934" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39932</link><pubDate>Fri, 04 Apr 2008 15:02:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39932</guid><dc:creator>Steve Campbell</dc:creator><description>&lt;p&gt;I'm a little wary of the auto-commit idea - explicit commits are important for lots of reasons, not least of which is identification of atomic changes that need to be integrated to other branches of the code. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;The idea of the working copy being auto-updated is ok for me, but may not work on larger projects that contain multiple solutions, in such a way that for the new working copy to function, I would need new binaries too, and possibly even a database migration script. &amp;nbsp;Also, if a programmer is spiking on something, then they may throw away changes - integrating too early can be a bad thing then.&lt;/p&gt;
&lt;p&gt;That said, I can see scenarios where the idea has merit - perhaps in the beginning stages of the project, where we are growing from nothing to something. &amp;nbsp;Often, team members have to wait around while someone else works on a core feature. &amp;nbsp;In that case, perhaps it would be good to get a more rapid integration cycle. &amp;nbsp;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39932" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39930</link><pubDate>Fri, 04 Apr 2008 13:40:44 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39930</guid><dc:creator>Jim Bolla</dc:creator><description>&lt;p&gt;&amp;quot;Many times my tests 'pass', but I am not done with either the test or code under test. &amp;quot;&lt;/p&gt;
&lt;p&gt;If you're writing new code that is not yet integrated into the entire system, then your teammate receiving this partially complete (but compiling and test passing) code should not disrupt him.&lt;/p&gt;
&lt;p&gt;If you're modifying existing code by refactoring or adding functionality but the tests all pass, then this should still be safe code for your teammate to use.&lt;/p&gt;
&lt;p&gt;If you're changing the behavior of code, and then changing the assertions in the tests for that code, then there is a chance that these changes may cause problems for your teammate. &lt;/p&gt;
&lt;p&gt;Derik, can you think of any other scenarios where a committed change may be disruptive to another teammember?&lt;/p&gt;
&lt;p&gt;So far I'm seeing two negative reactions:&lt;/p&gt;
&lt;p&gt;&amp;quot;I don't want my changes automatically committed&amp;quot; &lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;&amp;quot;I don't want my working copy automatically updated/&amp;quot;&lt;/p&gt;
&lt;p&gt;I think auto-committing is a great idea. It means tested changes are available for integration sooner.&lt;/p&gt;
&lt;p&gt;I can feel how auto-updating could be disrupted. This is probably where the tools need to work well to not disrupt the developer. I get this. But from my experience, at least 90% of the time changes could be merged in silently and successfully.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39930" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39928</link><pubDate>Fri, 04 Apr 2008 13:10:15 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39928</guid><dc:creator>Jim Bolla</dc:creator><description>&lt;p&gt;&amp;quot;developers need a stable base upon which to make changes over time&amp;quot;&lt;/p&gt;
&lt;p&gt;I agree. But I think that a code base that always compiles and passes a substantial battery of tests IS a stable base.&lt;/p&gt;
&lt;p&gt;&amp;quot;just b/c tests pass doesn't mean your changes are compatible with my changes&amp;quot;&lt;/p&gt;
&lt;p&gt;Assuming adequate test coverage and all the tests pass, then there's a high chance that the changes ARE compatible, because passing tests mean that the code still meets all of the assertions established in the tests.&lt;/p&gt;
&lt;p&gt;&amp;quot;have you never worked on a project where multiple ppl are changing the same files?&amp;quot;&lt;/p&gt;
&lt;p&gt;One scenario is when two people are editing a file in independent ways. Dev A is changing methods A, B,C and Dev B is changing methods X, Y, Z. This type of change should be transparently mergeable. The other scenario is when Dev A and Dev B are editing the same block of code, which leads to merge conflicts. In this scenario &amp;quot;CIVCS&amp;quot; wound't be able to not automerge the changes but instead could indicate the merge conflict by putting a &amp;quot;merge confilct&amp;quot; icon in the gutter to the left of the relevant lines of code.&lt;/p&gt;
&lt;p&gt;&amp;quot;the goal of CI isn't to automate your entire workflow.&amp;quot;&lt;/p&gt;
&lt;p&gt;Perhaps *my* goal is in fact to automate my workflow. There are different workflows that work well for different teams. I'm simply suggesting an alternative that I think has some potential.&lt;/p&gt;
&lt;p&gt;&amp;quot; that mindset is a slippery slope towards code generation and robots programming.&amp;quot;&lt;/p&gt;
&lt;p&gt;Code generation can be a powerful tool when used appropriately. For example, we generate DTO classes based on our database schema as part of our data access layer. This gives us a certain level of compile time validation of our data access. Our NUnit tests cover the rest. Reshaper templates are another form of code generation that is quite handy on the micro scale. And a web control is nothing more that a code construct (C#) that generates other code constructs (HTML + JS)&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39928" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39924</link><pubDate>Fri, 04 Apr 2008 10:31:58 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39924</guid><dc:creator>Derik Whittaker</dc:creator><description>&lt;p&gt;I don't like the idea of a passing test updating VC or kicking off CI. &amp;nbsp;Many times my tests 'pass', but I am not done with either the test or code under test. &amp;nbsp;I could have logic that is mid cycle and checking everything in could foobar the next guy trying to use my code.&lt;/p&gt;
&lt;p&gt;I see your point, but I think that check-ins have to be a manual, with intent process.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39924" width="1" height="1"&gt;</description></item><item><title>re: A Better Continuous Integration + Version Control System?</title><link>http://devlicio.us/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx#39922</link><pubDate>Fri, 04 Apr 2008 03:18:41 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39922</guid><dc:creator>keith</dc:creator><description>&lt;p&gt;automatic commits and updates is such a horrible idea.&lt;/p&gt;
&lt;p&gt;developers need a stable base upon which to make changes over time, which they sync up to the trunk when they are prepared to, not when their IDE chooses to. &amp;nbsp;just b/c tests pass doesn't mean your changes are compatible with my changes. &amp;nbsp;have you never worked on a project where multiple ppl are changing the same files? &amp;nbsp;&lt;/p&gt;
&lt;p&gt;the goal of CI isn't to automate your entire workflow. &amp;nbsp;that mindset is a slippery slope towards code generation and robots programming.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39922" width="1" height="1"&gt;</description></item></channel></rss>