<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tin&#039;s Blog &#187; JsUnit</title>
	<atom:link href="http://www.diamondtin.com/tag/jsunit/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diamondtin.com</link>
	<description>you are coming a long way...</description>
	<lastBuildDate>Wed, 11 Aug 2010 09:43:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>在Mac下启动多个Firefox实例方便JsUnit运行</title>
		<link>http://www.diamondtin.com/2008/%e5%9c%a8mac%e4%b8%8b%e5%90%af%e5%8a%a8%e5%a4%9a%e4%b8%aafirefox%e5%ae%9e%e4%be%8b%e6%96%b9%e4%be%bfjsunit%e8%bf%90%e8%a1%8c/</link>
		<comments>http://www.diamondtin.com/2008/%e5%9c%a8mac%e4%b8%8b%e5%90%af%e5%8a%a8%e5%a4%9a%e4%b8%aafirefox%e5%ae%9e%e4%be%8b%e6%96%b9%e4%be%bfjsunit%e8%bf%90%e8%a1%8c/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 00:11:16 +0000</pubDate>
		<dc:creator>tin</dc:creator>
				<category><![CDATA[Tech.技术]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[Continues Integretation]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JsUnit]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[持续集成]]></category>

		<guid isPermaLink="false">http://blog.agileito.com/tin/?p=42</guid>
		<description><![CDATA[项目中的JsUnit是使用ant脚本运行的，里面需要设置BROWSER_PATH的环境变量来启动浏览器。在本地check in代码的时候，我们会运行一下测试来减少愚蠢错误被提交到代码控制系统。但是在我的mac下Fir... ]]></description>
			<content:encoded><![CDATA[<p>项目中的JsUnit是使用ant脚本运行的，里面需要设置BROWSER_PATH的环境变量来启动浏览器。在本地check in代码的时候，我们会运行一下测试来减少愚蠢错误被提交到代码控制系统。但是在我的mac下Firefox只能启动一个实例，在运行JsUnit test的时候会提醒我已经打开了Firefox，不能打开另外一个实例，这样我必须关闭正在运行的Firefox。而且由于我比较喜欢打开非常多的Tabs来保持浏览状态，所以关闭Firefox让我很不爽，再说，因为重新启动的Firefox里面带了很多的Tabs，所以经常造成实际运行的JsUnit test发生随机性的超时错误，这个就不能容忍了，因为这无法保证我们的信心。</p>
<p>那么，为什么FF不能启动多个实例呢？原因是它们共享同一个Firefox的profile，所以没法多个实例并发访问。但是通过<a href="http://kb.mozillazine.org/Command_line_arguments">命令行参数</a>是可以创建多个profile给firefox的，简单了。不过遇到的问题是JsUnit的ant任务会检测BROWSER_PATH是否存在，所以如果我把带参数的命令行写到环境变量里面Ant无法检测到这个文件就会报错。那么如果关闭检测可以么？还是不行。因为JsUnit的StandaloneTest里面实际最后会调用DefaultProcessStarter的execute方法，这个方法调用Runtime.getRuntime().exec(command)，这个实现非常直接，不过因为parameters如果直接写到命令行里会发生文件无法找到的问题（应该用数组将命令和参数传入）所以没有办法传入，还是无法运行。</p>
<p>放弃hack吧，我可以修改Ant task和JsUnit的方法，但是绝对不好，因为这个hack没有提交回去的意义。<br />
所以换个思路，这样做：我们去写个shell来解决它。</p>
<p>先在终端运行/Applications/Firefox.app/Contents/MacOS/firefox-bin -CreateProfile jsunit，这时候会弹出窗口让你确认创建这个profile，选择一下不使用extensions和各种工具条，这样减少这些设置对测试的不良影响。<br />
然后在你的home目录创建一个firefox.sh，里面写上：</p>
<p><code>/Applications/Firefox.app/Contents/MacOS/firefox-bin -P jsunit $1</code></p>
<p>前提是你的Mac使用的是默认的bash，否则修改$1为对应的引用字符。然后chmod firefox.sh 555，让它可以运行。</p>
<p>下面就是修改你的~/.profile：</p>
<p><code>export BROWSER_PATH=/Users/[User path]/firefox.sh</code></p>
<p>source ~/.profile让修改生效再运行JsUnit就OK啦。如法炮制想开几个Firefox实例都可以啦。同样方法也适用于让Firefox2和Firefox3共同运行！非常简单。还可以做到开发和浏览分开……以此类推。</p>
<p>回顾一下JsUnit的代码写的不好，如果像Selenium一样能够自动创建一个profile就好了，因为那样可以减少测试之间的影响，还可以让Selenium并行执行。我想，如果有空我可以做一下这个工作:D</p>]]></content:encoded>
			<wfw:commentRss>http://www.diamondtin.com/2008/%e5%9c%a8mac%e4%b8%8b%e5%90%af%e5%8a%a8%e5%a4%9a%e4%b8%aafirefox%e5%ae%9e%e4%be%8b%e6%96%b9%e4%be%bfjsunit%e8%bf%90%e8%a1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写javascript单元测试是挺爽的事，可惜不要在safari上？</title>
		<link>http://www.diamondtin.com/2008/%e5%86%99javascript%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95%e6%98%af%e6%8c%ba%e7%88%bd%e7%9a%84%e4%ba%8b%ef%bc%8c%e5%8f%af%e6%83%9c%e4%b8%8d%e8%a6%81%e5%9c%a8safari%e4%b8%8a%ef%bc%9f/</link>
		<comments>http://www.diamondtin.com/2008/%e5%86%99javascript%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95%e6%98%af%e6%8c%ba%e7%88%bd%e7%9a%84%e4%ba%8b%ef%bc%8c%e5%8f%af%e6%83%9c%e4%b8%8d%e8%a6%81%e5%9c%a8safari%e4%b8%8a%ef%bc%9f/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 07:55:37 +0000</pubDate>
		<dc:creator>tin</dc:creator>
				<category><![CDATA[Tech.技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JsUnit]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.agileito.com/tin/?p=6</guid>
		<description><![CDATA[对于javascript来说，通过单元测试，你也可以实现TDD。对你非常有好处，一是减少了js变动带来的代码退化问题，另外一方面是TDD可以改变你设计程序的方式。 举个简单的例子，写javascript很多情... ]]></description>
			<content:encoded><![CDATA[<p>对于javascript来说，通过单元测试，你也可以实现TDD。对你非常有好处，一是减少了js变动带来的代码退化问题，另外一方面是TDD可以改变你设计程序的方式。<br />
举个简单的例子，写javascript很多情况下是和BOM（也就是文档模型）和DOM打交道的，这样可以说javascript程序很容易与dom高度耦合，这样的程序运行起来没有问题，但是应对需求变化的能力会比较地。但是根据人的思维方式，javascript很多时候是先出页面，然后根据页面逐渐调试着写出javascript，对于开发者来说，脑子里并不是真正的清楚自己要什么，而是在想界面的结果……这样产生的高耦合代码不容易测试，也难以面对多变的界面。<br />
所以，换一种方式思考。如果用单元测试的方式去写，你就需要考虑程序的可测试性，这会细化你的程序的模块粒度，因为细粒度的抽象容易单元测试。同时由于js单元测试的页面是mock出来的，所以一般都会尽量的简单，这样会减少程序远对界面的依赖。同时由于界面的可测是性问题，也许会减少对element的style的修改，转而使用语义话的css。例如如果一个元素高亮，你可以element.style['font-size']=&#8217;bold&#8217;;element.style.color=&#8217;red&#8217;l&#8230;.，当然你也可以element.addClassName(&#8216;highlight&#8217;)，然后那些不好验证的界面的约束条件可以放到css里面去，放给可用性和用户验收测试去验证。这样的单元测试的验证条件（assertion）会简单很多，如果写过单元测试的朋友肯定会有感触的。<br />
那么，常见的Javascript的单元测试框架有JsUnit和scrit.aculo.us的单元测试框架两个。前者方便用ant调用和分析结果，适合使用了ant的项目。而后者的优点就是界面好看，直接运行产生的报告清楚漂亮。所以小型项目我倾向后者，而大型项目我倾向前者。当然，由于js的动态特性，其实做个单元测试框架非常简单，所以自己动手也无妨。关键是要写，而且争取做到测试先行。</p>
<p>前面是个引子，其实写这个的原因是今天上午的一个郁闷的事。<br />
前面的blog entry说道我升级了Firefox3，结果遇到了getElementsByClassName问题。但是今天换到另外一个项目组，没有用那个方法，程序也正常。可是我TDD的写一个新的feature的时候却发现可爱的JsUnit的testRunner在Firefox3里面无法工作，从firebug里面看到了一堆安全性问题。估计是firefox3的新安全模型造成的吧。那么，由于firefox3覆盖了firefox2，所以难道我没法写程序了？当然不可以，还有safari嘛。马上开始去写测试了，写好测试执行测试，发现红条。嗯，很满意，因为TDD的红－绿－红－绿的节奏就是这样的。然后我开始去写实现来满足这个测试……结果忙活了一上午就是不行……而且发现一些原来的测试也无法通过了……我仔细寻找问题，diff修改的内容，可是最后实在没有发现任何让它不能通过的原因，因为手工在firebug里面都已经验证了写的实现是没有问题的呀……崩溃。此时我突然想起来我们的持续集成服务器里面没有跑safari的JsUnit测试……也就是说不能确定在safari下全绿（此时的背景是我们的持续集成显示全部绿色，也就是说所有的测试都可以同过，包括windows和linux平台还有IE及Firefox），那么我可能衰了。马上开动camino（靠，一上午都忘记用它执行JsUnit了，因为我的习惯是Camino里面保存to read list），运行一下全绿。很兴奋，但是感觉刚才寻找问题的1个多小时被无辜的浪费了，心疼呀。</p>
<p>那么，请注意啦，我只是想提醒，jsUnit可能不能在safari下正常工作（大部分测试没有问题，少量在其它浏览器正常的测试在safari下无法工作），我用的是safari3.0.4……</p>]]></content:encoded>
			<wfw:commentRss>http://www.diamondtin.com/2008/%e5%86%99javascript%e5%8d%95%e5%85%83%e6%b5%8b%e8%af%95%e6%98%af%e6%8c%ba%e7%88%bd%e7%9a%84%e4%ba%8b%ef%bc%8c%e5%8f%af%e6%83%9c%e4%b8%8d%e8%a6%81%e5%9c%a8safari%e4%b8%8a%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
