<?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>进化的测试 &#187; .NET</title>
	<atom:link href="http://magustest.com/blog/tag/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://magustest.com/blog</link>
	<description>关注软件测试，白盒测试，自动化测试，性能测试</description>
	<lastBuildDate>Wed, 02 Jun 2010 16:12:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>调试部署在IIS上的ASP.NET程序实用小技巧</title>
		<link>http://magustest.com/blog/net/tips-debugging-asp-net-on-iis/</link>
		<comments>http://magustest.com/blog/net/tips-debugging-asp-net-on-iis/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 08:07:46 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=566</guid>
		<description><![CDATA[远程调试ASP.NET程序，似乎是每一个做ASP.NET的人都肯定要掌握的技能，大家都知道，从IIS6开始，就有了application pool(应用程序池)的概念，每个应用程序池都会有单独的worker process，这样可以保障不同的应用程序池之间互相不会影响，就好像MySpace上有博客应用，有论坛应用等等……如果这些应用都用的同一个应用程序池，那么只要一个挂了，其他的也跟着挂。但是如果每个站点都单独使用一个应用程序池，那么A站点挂了对B站点不会有影响。同时如果A站点有部署更新，需要回收应用程序池，B站点不受影响，照常工作。 创建多个应用程序池虽然好处多多，不过却增大了调试的难度。假如一台服务器上有5个站点，那么正常运行的情况下就会有5个w3wp.exe进程，要找到合适的进程进行调试就是一个问题，以前比较笨，就看哪个进程的ID比较小，或者哪个进程占用的内存较多来“判断”，今天发现其实微软有一个非常靠谱的方法。 1. 打开一个命令行窗口 2. 浏览到“Windows &#62; System32” 3. 运行“cscript iisapp.vbs” 得到如图结果，哪个应用程序池对应哪个W3WP.EXE一目了然，从此告别瞎猜 Share and Enjoy: No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>远程调试ASP.NET程序，似乎是每一个做ASP.NET的人都肯定要掌握的技能，大家都知道，从IIS6开始，就有了application pool(应用程序池)的概念，每个应用程序池都会有单独的worker process，这样可以保障不同的应用程序池之间互相不会影响，就好像MySpace上有博客应用，有论坛应用等等……如果这些应用都用的同一个应用程序池，那么只要一个挂了，其他的也跟着挂。但是如果每个站点都单独使用一个应用程序池，那么A站点挂了对B站点不会有影响。同时如果A站点有部署更新，需要回收应用程序池，B站点不受影响，照常工作。</p>
<p>创建多个应用程序池虽然好处多多，不过却增大了调试的难度。假如一台服务器上有5个站点，那么正常运行的情况下就会有5个w3wp.exe进程，要找到合适的进程进行调试就是一个问题，以前比较笨，就看哪个进程的ID比较小，或者哪个进程占用的内存较多来“判断”，今天发现其实微软有一个非常靠谱的方法。</p>
<p>1. 打开一个命令行窗口</p>
<p>2. 浏览到“Windows &gt; System32”</p>
<p>3. 运行“cscript iisapp.vbs”</p>
<p>得到如图结果，哪个应用程序池对应哪个W3WP.EXE一目了然，从此告别瞎猜</p>
<p><img class="alignnone size-full wp-image-567" title="IIS-WORKER-PROCESS" src="http://magustest.com/blog/wp-content/uploads/2009/07/IIS-WORKER-PROCESS1.png" alt="IIS-WORKER-PROCESS" width="553" height="111" /></p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&amp;annotation=%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%EF%BC%8C%E4%BC%BC%E4%B9%8E%E6%98%AF%E6%AF%8F%E4%B8%80%E4%B8%AA%E5%81%9AASP.NET%E7%9A%84%E4%BA%BA%E9%83%BD%E8%82%AF%E5%AE%9A%E8%A6%81%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%8A%80%E8%83%BD%EF%BC%8C%E5%A4%A7%E5%AE%B6%E9%83%BD%E7%9F%A5%E9%81%93%EF%BC%8C%E4%BB%8EIIS6%E5%BC%80%E5%A7%8B%EF%BC%8C%E5%B0%B1%E6%9C%89%E4%BA%86application%20pool%28%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%29%E7%9A%84%E6%A6%82%E5%BF%B5%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%E9%83%BD%E4%BC%9A%E6%9C%89%E5%8D%95%E7%8B%AC%E7%9A%84worker%20process%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%8F%AF%E4%BB%A5%E4%BF" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&amp;bodytext=%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%EF%BC%8C%E4%BC%BC%E4%B9%8E%E6%98%AF%E6%AF%8F%E4%B8%80%E4%B8%AA%E5%81%9AASP.NET%E7%9A%84%E4%BA%BA%E9%83%BD%E8%82%AF%E5%AE%9A%E8%A6%81%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%8A%80%E8%83%BD%EF%BC%8C%E5%A4%A7%E5%AE%B6%E9%83%BD%E7%9F%A5%E9%81%93%EF%BC%8C%E4%BB%8EIIS6%E5%BC%80%E5%A7%8B%EF%BC%8C%E5%B0%B1%E6%9C%89%E4%BA%86application%20pool%28%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%29%E7%9A%84%E6%A6%82%E5%BF%B5%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%E9%83%BD%E4%BC%9A%E6%9C%89%E5%8D%95%E7%8B%AC%E7%9A%84worker%20process%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%8F%AF%E4%BB%A5%E4%BF" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&amp;notes=%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%EF%BC%8C%E4%BC%BC%E4%B9%8E%E6%98%AF%E6%AF%8F%E4%B8%80%E4%B8%AA%E5%81%9AASP.NET%E7%9A%84%E4%BA%BA%E9%83%BD%E8%82%AF%E5%AE%9A%E8%A6%81%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%8A%80%E8%83%BD%EF%BC%8C%E5%A4%A7%E5%AE%B6%E9%83%BD%E7%9F%A5%E9%81%93%EF%BC%8C%E4%BB%8EIIS6%E5%BC%80%E5%A7%8B%EF%BC%8C%E5%B0%B1%E6%9C%89%E4%BA%86application%20pool%28%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%29%E7%9A%84%E6%A6%82%E5%BF%B5%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%E9%83%BD%E4%BC%9A%E6%9C%89%E5%8D%95%E7%8B%AC%E7%9A%84worker%20process%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%8F%AF%E4%BB%A5%E4%BF" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;t=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F&amp;title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&amp;body=%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%EF%BC%8C%E4%BC%BC%E4%B9%8E%E6%98%AF%E6%AF%8F%E4%B8%80%E4%B8%AA%E5%81%9AASP.NET%E7%9A%84%E4%BA%BA%E9%83%BD%E8%82%AF%E5%AE%9A%E8%A6%81%E6%8E%8C%E6%8F%A1%E7%9A%84%E6%8A%80%E8%83%BD%EF%BC%8C%E5%A4%A7%E5%AE%B6%E9%83%BD%E7%9F%A5%E9%81%93%EF%BC%8C%E4%BB%8EIIS6%E5%BC%80%E5%A7%8B%EF%BC%8C%E5%B0%B1%E6%9C%89%E4%BA%86application%20pool%28%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%29%E7%9A%84%E6%A6%82%E5%BF%B5%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%E9%83%BD%E4%BC%9A%E6%9C%89%E5%8D%95%E7%8B%AC%E7%9A%84worker%20process%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%8F%AF%E4%BB%A5%E4%BF" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E8%B0%83%E8%AF%95%E9%83%A8%E7%BD%B2%E5%9C%A8IIS%E4%B8%8A%E7%9A%84ASP.NET%E7%A8%8B%E5%BA%8F%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Ftips-debugging-asp-net-on-iis%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/tips-debugging-asp-net-on-iis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Python脚本对ASP.NET站点进行预热</title>
		<link>http://magustest.com/blog/softwaretesting/warmup-asp-net-website/</link>
		<comments>http://magustest.com/blog/softwaretesting/warmup-asp-net-website/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 03:33:02 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[软件测试]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=550</guid>
		<description><![CDATA[很多人可能都会注意到，当一些新的代码部署到一个ASP.NET的站点后，第一次访问的时候是非常慢的，有可能需要等待超过一分钟；如果我们更新了站点的bin目录下的一些dll文件，那么这种情况会变得更加明显。当第一个页面请求到达服务器的时候，IIS会重新编译文件，这时候可以观察到w3wp.exe和csc.exe都会占用很多CPU。我们不希望用户是IIS重启之后第一个访问者，所以每台服务器在上线之前，都需要做预热处理。所谓预热处理，原理很简单，就是向目标服务器发送一些HTTP请求，从而触发服务器对文件进行编译，实现预热。 为什么用Python？一位大师曾经说过，程序员要每6个月就要学习一门新的语言（这个要求还真苛刻），所以决定学习一下Python。 需求：其实这个需求特别简单 1. 发送HTTP请求，Python自带的httplib库就能满足这个需求了 2. 多线程访问不同的站点，现在MySpace常用站点至少有4个 3. 指定服务器的IP，因为测试的服务器也有多台 4. 获取HTTP请求的状态 5. 需要在登录状态下进行预热 这个方法做了大部分的事情，Http请求，带登录状态的，能够指定IP的，指定站点的，指定页面的 1 2 3 4 5 6 7 8 9 def warmwww&#40;inputServer,inputHost,inputPage&#41;: conn = httplib.HTTPConnection&#40;inputServer&#41; headers = &#123;&#34;Host&#34;:inputHost,&#34;Cookie&#34;: &#34;MYUSERINFO=MIIxxx%3d&#34;&#125; conn.request&#40;&#34;GET&#34;, inputPage,&#34;&#34;,headers&#41; r1 = conn.getresponse&#40;&#41; data = r1.read&#40;&#41; conn.close&#40;&#41; global results results.append&#40;&#40;inputHost,r1.status&#41;&#41; 主要用到了httplib.HTTPConnection类，获得一个httplib.HTTPConnection的对象；登录就是在Headers里面加一个标志登录的Cookie；由于要支持多个服务器，所以在初始化httplib.HTTPConnection对象的时候，指定的是IP，然后在Headers里面的Host中指定需要预热的站点；最后GET某个站点下的某个页面作为预热；最后获取response的状态码。这里需要import httplib。 接下来要做的就是用多进程来访问需要预热的站点 1 2 3 4 5 6 7 8 [...]


Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>很多人可能都会注意到，当一些新的代码部署到一个ASP.NET的站点后，第一次访问的时候是非常慢的，有可能需要等待超过一分钟；如果我们更新了站点的bin目录下的一些dll文件，那么这种情况会变得更加明显。当第一个页面请求到达服务器的时候，IIS会重新编译文件，这时候可以观察到w3wp.exe和csc.exe都会占用很多CPU。我们不希望用户是IIS重启之后第一个访问者，所以每台服务器在上线之前，都需要做预热处理。所谓预热处理，原理很简单，就是向目标服务器发送一些HTTP请求，从而触发服务器对文件进行编译，实现预热。</p>
<p>为什么用Python？一位大师曾经说过，程序员要每6个月就要学习一门新的语言（这个要求还真苛刻），所以决定学习一下Python。</p>
<p>需求：其实这个需求特别简单<br />
1. 发送HTTP请求，Python自带的httplib库就能满足这个需求了<br />
2. 多线程访问不同的站点，现在MySpace常用站点至少有4个<br />
3. 指定服务器的IP，因为测试的服务器也有多台<br />
4. 获取HTTP请求的状态<br />
5. 需要在登录状态下进行预热<br />
<span id="more-550"></span></p>
<p>这个方法做了大部分的事情，Http请求，带登录状态的，能够指定IP的，指定站点的，指定页面的</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> warmwww<span style="color: black;">&#40;</span>inputServer,inputHost,inputPage<span style="color: black;">&#41;</span>:
	conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPConnection</span><span style="color: black;">&#40;</span>inputServer<span style="color: black;">&#41;</span>
	headers = <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;Host&quot;</span>:inputHost,<span style="color: #483d8b;">&quot;Cookie&quot;</span>: <span style="color: #483d8b;">&quot;MYUSERINFO=MIIxxx%3d&quot;</span><span style="color: black;">&#125;</span>
	conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, inputPage,<span style="color: #483d8b;">&quot;&quot;</span>,headers<span style="color: black;">&#41;</span>
	r1 = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	data = r1.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">global</span> results
	results.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>inputHost,r1.<span style="color: black;">status</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>主要用到了httplib.HTTPConnection类，获得一个httplib.HTTPConnection的对象；登录就是在Headers里面加一个标志登录的Cookie；由于要支持多个服务器，所以在初始化httplib.HTTPConnection对象的时候，指定的是IP，然后在Headers里面的Host中指定需要预热的站点；最后GET某个站点下的某个页面作为预热；最后获取response的状态码。这里需要import httplib。</p>
<p>接下来要做的就是用多进程来访问需要预热的站点</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span>server,paras<span style="color: black;">&#41;</span>:
	threadcount = <span style="color: #ff4500;">0</span><span style="color: #66cc66;">;</span>
	threadList = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> pa <span style="color: #ff7700;font-weight:bold;">in</span> paras:
		rm = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target = warmwww, args=<span style="color: black;">&#40;</span>server,pa<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,pa<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		rm.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		threadList.<span style="color: black;">append</span><span style="color: black;">&#40;</span>rm<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> rt <span style="color: #ff7700;font-weight:bold;">in</span> threadList:
		rt.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		threadcount = threadcount + <span style="color: #ff4500;">1</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> threadcount,<span style="color: #483d8b;">&quot;Threads started. Run on server&quot;</span>, server</pre></td></tr></table></div>

<p>threading.Thread()可以实例化一个Thread对象，参数target就是需要运行的方法，在Python里面，方法也是一个对象；如果target是带有参数的，那么就要通过args把参数传递进去。这里需要import threading。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
	successFlag = <span style="color: #008000;">True</span><span style="color: #66cc66;">;</span>
	begintime = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	run<span style="color: black;">&#40;</span>server,paras<span style="color: black;">&#41;</span>
	endtime = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Finish the task in&quot;</span>, endtime-begintime, <span style="color: #483d8b;">&quot;seconds&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> sr <span style="color: #ff7700;font-weight:bold;">in</span> results:
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>sr<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">!</span>=<span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Warm up&quot;</span>,sr<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">&quot;failed.&quot;</span>, <span style="color: #483d8b;">&quot;status code:&quot;</span>,sr<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
			successFlag = <span style="color: #008000;">False</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> successFlag:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;all warm up script run successfully.&quot;</span></pre></td></tr></table></div>

<p>paras是一个预先定义好的列表。results是一个全局变量，每个预热的结果都会存到results中，等预热程序执行完毕以后，检查其返回的状态码，如果等于200，就算通过；否则，就认为预热失败，并且打印出返回状态码。</p>
<p>经常会看有有人在论坛上提问，例如如何在XXX工具中发送带有cookie的请求，如果在YYY工具中模拟已经登录的用户做操作。其实这当中最根本的问题应该是，登录的原理是什么，知道这个原理以后，就很容易找到实现的方法，不管用的是C#还是Python。工具是手段，原理是根本。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&amp;title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD&amp;notes=%E5%BE%88%E5%A4%9A%E4%BA%BA%E5%8F%AF%E8%83%BD%E9%83%BD%E4%BC%9A%E6%B3%A8%E6%84%8F%E5%88%B0%EF%BC%8C%E5%BD%93%E4%B8%80%E4%BA%9B%E6%96%B0%E7%9A%84%E4%BB%A3%E7%A0%81%E9%83%A8%E7%BD%B2%E5%88%B0%E4%B8%80%E4%B8%AAASP.NET%E7%9A%84%E7%AB%99%E7%82%B9%E5%90%8E%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%AE%BF%E9%97%AE%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E9%9D%9E%E5%B8%B8%E6%85%A2%E7%9A%84%EF%BC%8C%E6%9C%89%E5%8F%AF%E8%83%BD%E9%9C%80%E8%A6%81%E7%AD%89%E5%BE%85%E8%B6%85%E8%BF%87%E4%B8%80%E5%88%86%E9%92%9F%EF%BC%9B%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E6%9B%B4%E6%96%B0%E4%BA%86%E7%AB%99%E7%82%B9%E7%9A%84bin%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E4%B8%80%E4%BA%9Bdll%E6%96%87%E4%BB%B6%EF%BC%8C%E9%82%A3%E4%B9%88%E8%BF%99%E7%A7%8D%E6%83%85" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&amp;t=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&amp;title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F&amp;title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD&amp;body=%E5%BE%88%E5%A4%9A%E4%BA%BA%E5%8F%AF%E8%83%BD%E9%83%BD%E4%BC%9A%E6%B3%A8%E6%84%8F%E5%88%B0%EF%BC%8C%E5%BD%93%E4%B8%80%E4%BA%9B%E6%96%B0%E7%9A%84%E4%BB%A3%E7%A0%81%E9%83%A8%E7%BD%B2%E5%88%B0%E4%B8%80%E4%B8%AAASP.NET%E7%9A%84%E7%AB%99%E7%82%B9%E5%90%8E%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%AE%BF%E9%97%AE%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E9%9D%9E%E5%B8%B8%E6%85%A2%E7%9A%84%EF%BC%8C%E6%9C%89%E5%8F%AF%E8%83%BD%E9%9C%80%E8%A6%81%E7%AD%89%E5%BE%85%E8%B6%85%E8%BF%87%E4%B8%80%E5%88%86%E9%92%9F%EF%BC%9B%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%AC%E6%9B%B4%E6%96%B0%E4%BA%86%E7%AB%99%E7%82%B9%E7%9A%84bin%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E4%B8%80%E4%BA%9Bdll%E6%96%87%E4%BB%B6%EF%BC%8C%E9%82%A3%E4%B9%88%E8%BF%99%E7%A7%8D%E6%83%85" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E7%94%A8Python%E8%84%9A%E6%9C%AC%E5%AF%B9ASP.NET%E7%AB%99%E7%82%B9%E8%BF%9B%E8%A1%8C%E9%A2%84%E7%83%AD%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fwarmup-asp-net-website%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/softwaretesting/warmup-asp-net-website/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息</title>
		<link>http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/</link>
		<comments>http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 15:27:20 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[软件测试]]></category>
		<category><![CDATA[Profiler]]></category>
		<category><![CDATA[VSTS]]></category>
		<category><![CDATA[代码覆盖]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=454</guid>
		<description><![CDATA[前两篇文章介绍了VSTS性能分析工具Profiler和如何用Profiler发现性能问题并且进行优化。今天想分享一下如何在测试ASP.NET程序的过程中获取代码覆盖率的信息。 设想如下场景，测试人员介入到项目的需求，分析，设计的阶段，得到了很多有用的文档和信息。接下来就到了编码的阶段，在这个时候测试工程师开始根据前面获得的信息来设计测试用例，做用例评审，力求测试用例覆盖能覆盖系统的每一个角落。不幸的是，系统实在是太大，没有人能确切地知道手上的测试用例对系统的覆盖（这里指定为代码的行覆盖）能达到什么样的程度。对于系统的关键部分，没有人希望在经过几轮测试以后，还有相当部分的代码是没有被执行过的。 解决这个问题的其中一个方法，就是对关键部分的代码进行代码覆盖率的统计。平时我做单元测试和接口测试的时候，得益于IDE的帮助，代码覆盖率信息很容易就能得到，但是对于部署在IIS上的ASP.NET代码，又如何去收集代码覆盖率信息呢？曾经找过好多.NET的代码覆盖率工具，没有合适的。不过就在最近，让我发现了VSPerfMon，VSTS自带的性能数据收集工具。真是众里寻他千百度，蓦然回首，那工具却在灯火阑珊处。 1. 首先要对需要进行代码覆盖率信息收集的二进制文件(DLL, EXE)用VSInstr进行处理，记得带上/COVERAGE参数 VSInstr &#8220;D:\Websites\somewhere\bin\MySpace.Web.UserHome.dll&#8221; /COVERAGE 2. 停掉IIS iisreset /stop 3. 用VSPerfClrEnv 设置相关的环境变量 VSPerfClrEnv /globaltraceon 4. 启动VSPerfMon；参数/COVERAGE代表本次监控收集的数据是代码覆盖率；/user:&#8221;NETWORK SERVICE&#8221;，指定用户名;/CS 启用跨域会话分析；/output:&#8221;d:\magus\0422.coverage&#8221;，指定输出文件的名字和路径，记得用.coverage作为扩展名。 VSPerfMon /COVERAGE /user:&#8221;NETWORK SERVICE&#8221; /CS /output:&#8221;d:\magus\0422.coverage&#8221; 在运行完上面这条命令以后，CMD窗口就提示： Started in Stand Alone Mode Filename: d:\magus\0422.coverage 这时候需要打开一个新的CMD进行余下的操作(原来的CMD就叫CMD_A，新开的就叫CMD_B吧) 5. 停止收集代码覆盖率信息数据，因为不想让代码覆盖率信息受到影响。 VSPerfCmd /globaloff 6. 启动IIS iisreset /start 7. 对ASP.NET程序进行预热 8. 重新开启代码覆盖率信息的收集 VSPerfCmd /globalon 9. 运行测试用例，手工OR自动都可以 10. 停止代码覆盖率信息的收集 [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/intruduction-to-vsts-profile/' rel='bookmark' title='Permanent Link: VSTS性能分析工具Profiler的介绍'>VSTS性能分析工具Profiler的介绍</a></li>
<li><a href='http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/' rel='bookmark' title='Permanent Link: 用VSTS Profiler发现性能问题并且进行优化实例'>用VSTS Profiler发现性能问题并且进行优化实例</a></li>
<li><a href='http://magustest.com/blog/net/tips-debugging-asp-net-on-iis/' rel='bookmark' title='Permanent Link: 调试部署在IIS上的ASP.NET程序实用小技巧'>调试部署在IIS上的ASP.NET程序实用小技巧</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>前两篇文章介绍了<a href="http://magustest.com/blog/net/intruduction-to-vsts-profile/" target="_blank">VSTS性能分析工具Profiler</a>和<a href="http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/" target="_blank">如何用Profiler发现性能问题并且进行优化</a>。今天想分享一下如何在测试ASP.NET程序的过程中获取代码覆盖率的信息。</p>
<p>设想如下场景，测试人员介入到项目的需求，分析，设计的阶段，得到了很多有用的文档和信息。接下来就到了编码的阶段，在这个时候测试工程师开始根据前面获得的信息来设计测试用例，做用例评审，力求测试用例覆盖能覆盖系统的每一个角落。不幸的是，系统实在是太大，没有人能确切地知道手上的测试用例对系统的覆盖（这里指定为代码的行覆盖）能达到什么样的程度。对于系统的关键部分，没有人希望在经过几轮测试以后，还有相当部分的代码是没有被执行过的。</p>
<p>解决这个问题的其中一个方法，就是对关键部分的代码进行代码覆盖率的统计。平时我做单元测试和接口测试的时候，得益于IDE的帮助，代码覆盖率信息很容易就能得到，但是对于部署在IIS上的ASP.NET代码，又如何去收集代码覆盖率信息呢？曾经找过好多.NET的代码覆盖率工具，没有合适的。不过就在最近，让我发现了VSPerfMon，VSTS自带的性能数据收集工具。真是众里寻他千百度，蓦然回首，那工具却在灯火阑珊处。</p>
<p><strong>1. 首先要对需要进行代码覆盖率信息收集的二进制文件(DLL, EXE)用VSInstr进行处理，记得带上/COVERAGE参数</strong></p>
<p><em><span style="text-decoration: underline;">VSInstr &#8220;D:\Websites\somewhere\bin\MySpace.Web.UserHome.dll&#8221; /COVERAGE</span></em></p>
<p><strong>2. 停掉IIS</strong></p>
<p><em><span style="text-decoration: underline;">iisreset /stop</span></em></p>
<p><strong>3. 用VSPerfClrEnv 设置相关的环境变量</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfClrEnv /globaltraceon</span></em></p>
<p><strong>4. 启动VSPerfMon；参数/COVERAGE代表本次监控收集的数据是代码覆盖率；/user:&#8221;NETWORK SERVICE&#8221;，指定用户名;/CS 启用跨域会话分析；/output:&#8221;d:\magus\0422.coverage&#8221;，指定输出文件的名字和路径，记得用.coverage作为扩展名。</strong><br />
<span id="more-454"></span><br />
<em><span style="text-decoration: underline;">VSPerfMon /COVERAGE /user:&#8221;NETWORK SERVICE&#8221; /CS /output:&#8221;d:\magus\0422.coverage&#8221;</span></em></p>
<p>在运行完上面这条命令以后，CMD窗口就提示：</p>
<blockquote><p>Started in Stand Alone Mode<br />
Filename: d:\magus\0422.coverage</p></blockquote>
<p>这时候<span style="text-decoration: underline;"><strong>需要打开一个新的CMD进行余下的操作(原来的CMD就叫CMD_A，新开的就叫CMD_B吧)</strong></span></p>
<p><strong>5. 停止</strong><strong>收集</strong><strong>代码覆盖率信息数据，因为不想让代码覆盖率信息受到影响。</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /globaloff</span></em></p>
<p><strong>6. 启动IIS</strong></p>
<p><em><span style="text-decoration: underline;">iisreset /start</span></em></p>
<p><strong>7. 对ASP.NET程序进行预热</strong></p>
<p><strong>8. 重新开启代码覆盖率信息的收集</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /globalon</span></em></p>
<p><strong>9. 运行测试用例，手工OR自动都可以</strong></p>
<p><strong>10. 停止代码覆盖率信息的收集</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /globaloff</span></em></p>
<p><strong>11. 停止IIS</strong></p>
<p><em><span style="text-decoration: underline;">iisreset /stop</span></em></p>
<p>这时候在CMD_A中会提示“UnRegistering process (7784)”，还是保持CMD_A不动，继续操作CMD_B</p>
<p><strong>12. 结束代码覆盖率的收集，并且生成.coverage文件</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /shutdown</span></em></p>
<p>这时候在原来的CMD_A中就会出现如下信息：</p>
<blockquote><p>Shutting Down Named Pipe Server<br />
Shutting Down Buffer Writer<br />
Shutting Down Process Deamon</p></blockquote>
<p>如果没有看到错误提示信息，那么本次代码覆盖率收集就应该成功了。</p>
<p><strong>13. 在VSTS IDE中打开刚才生成的.coverage查看代码覆盖率。</strong></p>
<p>如图：</p>
<p><img class="alignnone size-full wp-image-455" title="coverage" src="http://magustest.com/blog/wp-content/uploads/2009/04/coverage1.png" alt="coverage" width="610" height="212" /></p>
<p>正如以前讨论过的，<a href="http://magustest.com/blog/softwaretesting/whiteboxtesting/100-percent-statement-coverage-not-enough/" target="_blank">100%的代码覆盖率是不够的</a>，那么我们在拿到代码覆盖率数据以后，应该看一下在运行完测试用例以后以后，系统的哪些代码还没有被执行过，然后回头设计一些新的测试用例来测试那些未被测试的代码。这就要求<a href="http://magustest.com/blog/softwaretesting/do-software-tester-needs-to-know-how-to-code/" target="_blank">测试工程师要能看懂代码</a>了。</p>
<p>本文思路得益于大半年前看到这篇博客“<a href="http://www.51testing.com/?uid-13997-action-viewspace-itemid-87396" target="_blank">如何引入代码覆盖率度量提高测试质量</a>”，一直惦记于心，终于找到了适用于.NET程序的解决方法了，呵呵。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F&amp;t=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F&title=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F&title=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F&amp;title=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E7%94%A8VSPerfMon%E5%9C%A8%E6%B5%8B%E8%AF%95ASP.NET%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%94%B6%E9%9B%86%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%BF%A1%E6%81%AF%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fcollecting-aspnet-code-coverage-date-using-vsperfmon%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/intruduction-to-vsts-profile/' rel='bookmark' title='Permanent Link: VSTS性能分析工具Profiler的介绍'>VSTS性能分析工具Profiler的介绍</a></li>
<li><a href='http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/' rel='bookmark' title='Permanent Link: 用VSTS Profiler发现性能问题并且进行优化实例'>用VSTS Profiler发现性能问题并且进行优化实例</a></li>
<li><a href='http://magustest.com/blog/net/tips-debugging-asp-net-on-iis/' rel='bookmark' title='Permanent Link: 调试部署在IIS上的ASP.NET程序实用小技巧'>调试部署在IIS上的ASP.NET程序实用小技巧</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用VSTS Profiler发现性能问题并且进行优化实例</title>
		<link>http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/</link>
		<comments>http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 04:11:50 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[性能测试]]></category>
		<category><![CDATA[Profiler]]></category>
		<category><![CDATA[VSTS]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=439</guid>
		<description><![CDATA[上一篇文章介绍了如何使用VSTS的Profiler，今天想分享一下对于一个ASP.NET应用程序，用Profiler找到性能问题并且对之进行优化。 由于ASP.NET程序运行在一个硕大的框架上，所以一般用Sample模式收集到的数据，对发现性能问题帮助不大，以下是一个用Sample模式收集的结果： 从这个报告中我们可以看到，前5个工作量最大的函数和执行单独工作最多的函数都是系统函数。 下面看一下有针对性地用检测模式收集的数据： 本文就采用“检测”模式收集性能数据来进行分析和处理。 首先，把本次测试的目标DLL用VSInstr工具进行处理，使得Profiler能够收集相关的性能数据，这一个步骤非常关键，通常来说不需要设置额外的参数，就是默认的方式就可以了，例如：VSInstr &#8220;D:\Websites\xxxx\bin\xxxx.dll&#8221;，在处理的过程中可能会提示一些错误，具体错误的信息可以在这里查找。把相应的DLL处理完毕以后，就在命令行输入以下指令（命令行的指令用斜体加下划线表示；说明文字加黑） 停止IIS iisreset /stop 设置分析.NET应用程序所需要的环境变量，在运行完这个命令以后需要重启。由于使用检测方式进行数据采集，所以这里我用globaltraceon参数。 VSPerfClrEnv /globaltraceon 启动性能数据收集。/start:trace，告诉收集器要收集检测数据；/user:&#8221;NETWORK SERVICE&#8221; ，由于是要对IIS进行的数据进行采集，所以需要制定用户NETWORK SERVICE；/CS，启用跨进程分析，看了一些文章说是分析ASP.NET程序一般都把这个选项打开，原因不详；/output:&#8221;d:\magus\0422.vsp&#8221;，指定输出文件的路径和名称；/wincounter:&#8221;\Processor(_Total)\% Processor Time&#8221;，收集处理器的参数，这里需要注意的是，wincouter后面的性能计数器名字一定要是全名，有一个方法可以查询系统的性能计数器的全称，就是用VSTS的Server Explorer，然后找到相应的服务器(一般是本机)，下面有一个“Performance Counters”；如果要收集多个性能计数器的数据，只需要多加几个 /wincounter 参数即可，例如我在收集处理器时间的同时，还想知道Context Switcher每秒的数据。 VSPerfCmd /start:trace /user:&#8221;NETWORK SERVICE&#8221; /CS /output:&#8221;d:\magus\0422.vsp&#8221; /wincounter:&#8221;\Processor(_Total)\% Processor Time&#8221; /wincounter:&#8221;\System\Context Switches/sec&#8221; 在IIS起来之前先停止性能数据的收集 VSPerfCmd /globaloff 启动IIS iisreset /start 对程序进行预热，这一步也是很关键，因为IIS启动以后，程序需要预热才能达到稳定的状态，因为程序首次被访问的时候有些代码会被编译，所以为了降低对性能测试的影响，应该现对被测的程序进行预热。在预热完毕以后重新启动性能数据的收集。 VSPerfCmd /globalon &#8211; 运行性能测试场景 &#8211; 测试运行完毕以后，停止性能数据的收集 VSPerfCmd /globaloff 停掉IIS iisreset /stop 关闭性能数据收集器，这一步完成以后就能生成包含数据的文件了 VSPerfCmd [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/intruduction-to-vsts-profile/' rel='bookmark' title='Permanent Link: VSTS性能分析工具Profiler的介绍'>VSTS性能分析工具Profiler的介绍</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/' rel='bookmark' title='Permanent Link: 用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息'>用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息</a></li>
<li><a href='http://magustest.com/blog/linux/setup-snmpd-conf/' rel='bookmark' title='Permanent Link: Linux下的snmpd.conf配置说明'>Linux下的snmpd.conf配置说明</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>上一篇文章介绍了<a href="http://magustest.com/blog/net/intruduction-to-vsts-profile/" target="_blank">如何使用VSTS的Profiler</a>，今天想分享一下对于一个ASP.NET应用程序，用Profiler找到性能问题并且对之进行优化。</p>
<p>由于ASP.NET程序运行在一个硕大的框架上，所以一般用Sample模式收集到的数据，对发现性能问题帮助不大，以下是一个用Sample模式收集的结果：</p>
<p><img class="alignnone size-full wp-image-442" title="iis-sample" src="http://magustest.com/blog/wp-content/uploads/2009/04/iis-sample1.png" alt="iis-sample" width="549" height="236" /></p>
<p>从这个报告中我们可以看到，前5个工作量最大的函数和执行单独工作最多的函数都是系统函数。</p>
<p>下面看一下有针对性地用检测模式收集的数据：</p>
<p><img class="alignnone size-full wp-image-444" title="instr-function-with-indi-work1" src="http://magustest.com/blog/wp-content/uploads/2009/04/instr-function-with-indi-work11.png" alt="instr-function-with-indi-work1" width="532" height="139" /></p>
<p>本文就采用“检测”模式收集性能数据来进行分析和处理。</p>
<p>首先，把本次测试的目标DLL用VSInstr工具进行处理，使得Profiler能够收集相关的性能数据，这一个步骤非常关键，通常来说不需要设置额外的参数，就是默认的方式就可以了，例如：VSInstr &#8220;D:\Websites\xxxx\bin\xxxx.dll&#8221;，在处理的过程中可能会提示一些错误，具体错误的信息可以在<a href="http://msdn.microsoft.com/en-us/library/ms242734.aspx" target="_blank">这里</a>查找。把相应的DLL处理完毕以后，就在命令行输入以下指令（命令行的指令用斜体加下划线表示；说明文字加黑）<br />
<span id="more-439"></span><br />
<strong>停止IIS</strong></p>
<p><span style="text-decoration: underline;"><em>iisreset /stop</em></span></p>
<p><strong>设置分析.NET应用程序所需要的环境变量，在运行完这个命令以后需要重启。由于使用检测方式进行数据采集，所以这里我用globaltraceon参数。</strong></p>
<p><span style="text-decoration: underline;"><em>VSPerfClrEnv /globaltraceon</em></span></p>
<p><strong>启动性能数据收集。<span style="text-decoration: underline;">/start:trace</span>，告诉收集器要收集检测数据；/user:&#8221;NETWORK SERVICE&#8221; ，由于是要对IIS进行的数据进行采集，所以需要制定用户NETWORK SERVICE；<span style="text-decoration: underline;">/CS</span>，启用跨进程分析，看了一些文章说是分析ASP.NET程序一般都把这个选项打开，原因不详；<span style="text-decoration: underline;">/output:&#8221;d:\magus\0422.vsp&#8221;</span>，指定输出文件的路径和名称；<span style="text-decoration: underline;">/wincounter:&#8221;\Processor(_Total)\% Processor Time&#8221;</span>，收集处理器的参数，这里需要注意的是，wincouter后面的性能计数器名字一定要是全名，有一个方法可以查询系统的性能计数器的全称，就是用VSTS的Server Explorer，然后找到相应的服务器(一般是本机)，下面有一个“Performance Counters”；如果要收集多个性能计数器的数据，只需要多加几个 /wincounter 参数即可，例如我在收集处理器时间的同时，还想知道Context Switcher每秒的数据。</strong></p>
<p><span style="text-decoration: underline;"><em>VSPerfCmd /start:trace /user:&#8221;NETWORK SERVICE&#8221; /CS /output:&#8221;d:\magus\0422.vsp&#8221; /wincounter:&#8221;\Processor(_Total)\% Processor Time&#8221; /wincounter:&#8221;\System\Context Switches/sec&#8221;</em></span></p>
<p><strong>在IIS起来之前先停止性能数据的收集</strong></p>
<p><span style="text-decoration: underline;"><em>VSPerfCmd /globaloff</em></span></p>
<p><strong>启动IIS</strong></p>
<p><em><span style="text-decoration: underline;">iisreset /start</span></em></p>
<p><strong>对程序进行预热，这一步也是很关键，因为IIS启动以后，程序需要预热才能达到稳定的状态，因为程序首次被访问的时候有些代码会被编译，所以为了降低对性能测试的影响，应该现对被测的程序进行预热。在预热完毕以后重新启动性能数据的收集。</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /globalon</span></em></p>
<p><strong>&#8211; 运行性能测试场景 &#8211;<br />
</strong></p>
<p><strong>测试运行完毕以后，停止性能数据的收集</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /globaloff</span></em></p>
<p><strong>停掉IIS</strong></p>
<p><em><span style="text-decoration: underline;">iisreset /stop</span></em></p>
<p><strong>关闭性能数据收集器，这一步完成以后就能生成包含数据的文件了</strong></p>
<p><em><span style="text-decoration: underline;">VSPerfCmd /shutdown</span></em></p>
<p>首先来看看收集到的报告</p>
<p><img class="alignnone size-full wp-image-447" title="time-before-opt1" src="http://magustest.com/blog/wp-content/uploads/2009/04/time-before-opt11.png" alt="time-before-opt1" width="547" height="55" /></p>
<p>在这个方法里面有一段不知名方法（其实是因为没有相应的Symbol，⊙﹏⊙b汗）占用了大量的计算时间，然后就找到相应的代码，原来该不知名方法是一个动态生成的代码，该段代码大概就是会创建一个新的Client对象，然后向另外一台服务器发起一个请求。其实不用每次调用该方法都创建一个新的Client对象。然后我尝试着把这个Client改为静态变量，经过优化以后的报告对比如下：</p>
<p><img class="alignnone size-full wp-image-448" title="time-after-opt" src="http://magustest.com/blog/wp-content/uploads/2009/04/time-after-opt1.png" alt="time-after-opt" width="523" height="251" /></p>
<p>效果还是挺明显的，但是当我重新测试一下性能的时候，被打击了一下，改动前后的性能对比相差很小，小的都可以认为是误差：P，因为在一个颇为庞大的项目中，这点小小的改动的确不可能影响大局。不过这次试验让我学会了用Profiler来找到ASP.NET运行中执行较慢的语句，并且看看这些语句有什么问题（可能是一个调用存储过程的方法很慢，而真正的原因是数据库有问题），定位问题所在，然后解决问题，最后回测一下对比改动前后的结果。看是否达到预期的优化效果。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F&amp;t=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F&title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F&title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F&amp;title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F&amp;title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B&amp;body=%E4%B8%8A%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E4%BB%8B%E7%BB%8D%E4%BA%86%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8VSTS%E7%9A%84Profiler%EF%BC%8C%E4%BB%8A%E5%A4%A9%E6%83%B3%E5%88%86%E4%BA%AB%E4%B8%80%E4%B8%8B%E5%AF%B9%E4%BA%8E%E4%B8%80%E4%B8%AAASP.NET%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%8C%E7%94%A8Profiler%E6%89%BE%E5%88%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E5%AF%B9%E4%B9%8B%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E3%80%82%0A%0A%E7%94%B1%E4%BA%8EASP.NET%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%A1%95%E5%A4%A7%E7%9A%84%E6%A1%86%E6%9E%B6%E4%B8%8A%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B8%80%E8%88%AC%E7%94%A8Sample%E6%A8%A1%E5%BC%8F%E6" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E7%94%A8VSTS%20Profiler%E5%8F%91%E7%8E%B0%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98%E5%B9%B6%E4%B8%94%E8%BF%9B%E8%A1%8C%E4%BC%98%E5%8C%96%E5%AE%9E%E4%BE%8B%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fusing-vsts-profiler-find-bottleneck-and-optimize%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/intruduction-to-vsts-profile/' rel='bookmark' title='Permanent Link: VSTS性能分析工具Profiler的介绍'>VSTS性能分析工具Profiler的介绍</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/' rel='bookmark' title='Permanent Link: 用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息'>用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息</a></li>
<li><a href='http://magustest.com/blog/linux/setup-snmpd-conf/' rel='bookmark' title='Permanent Link: Linux下的snmpd.conf配置说明'>Linux下的snmpd.conf配置说明</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VSTS性能分析工具Profiler的介绍</title>
		<link>http://magustest.com/blog/net/intruduction-to-vsts-profile/</link>
		<comments>http://magustest.com/blog/net/intruduction-to-vsts-profile/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 08:41:23 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[性能测试]]></category>
		<category><![CDATA[Profiler]]></category>
		<category><![CDATA[VSTS]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=426</guid>
		<description><![CDATA[在MSDN文档中，对于VSTS中的Development Edition的介绍主要分两大块，第一是“编写高质量的代码”，第二就是“使用分析工具对应用程序性能进行分析”。在VSTS里面有一个工具，叫Profiler，这个工具可以帮助研发人员在程序运行的过程中收集相关的数据，并且对之进行分析，从而达到帮助实现性能调优的目的。本文讲述如何在使用命令行工具来对ASP.NET程序进行性能测试相关数据的收集。 在VSTS的Profiler中，有两种(VSTS2010好像有5种了)Profiling的方法，第一种是采样(Sampling)，第二种是检测(Instrumentation)。对于采样模式，它的工作原理是Profiler定期中断CPU并且收集函数的调用堆栈信息。在网上找到一个图，对于采样工作方式的描述非常清晰： 对于检测模式，他的工作原理是用VSInstr程序在原始的代码中插入一些用于计算时间的代码，例如A函数调用B函数，那么在调用B函数的前后都会被插入用于计算时间的代码，具体可以看下图： 下面我自己写了一个小的Sample类，然后把编译好的代码用Reflector来查看，很容易地就能看出区别。第一个图是没有经过VSInstr处理的原始代码： 下图就是经过VSInstr处理后，反编译后的代码： 可以看到VSInstr程序修改了原来的DLL。在检测模式下，只有经过修改后的DLL才能收集到数据。 在VSTS中，一般可以通过Analyze菜单下的Launch Performance Wizard来新建一个性能会话，然后进行性能数据的采集。 对于ASP.NET程序，可以通过以下步骤来进行“采样” iisreset /stop VSPerfClrEnv /globalsampleon VSPerfCmd /start:sample /user:&#8221;NETWORK SERVICE&#8221; /output:&#8221;d:\somewhere\xxxx.vsp&#8221; VSPerfCmd /globaloff iisreset /start VSPerfCmd /attach:xxxx VSPerfCmd /globalon &#8211;run the test scenario&#8211; VSPerfCmd /globaloff VSPerfCmd /detach iisreset /stop VSPerfCmd /shutdown 第一步是停掉IIS 然后通过VSPerfClrEnv对环境变量进行设置，具体可以查文档，做完这一步以后通常需要重启一下电脑 第三步就是通过VSPerfCmd启动性能数据收集 接下来的VSPerfCmd /globaloff就是暂停性能数据的收集 然后重启IIS，并且访问一下这个服务器上的页面，使得W3WP进程启动 查看W3WP.EXE的进程ID，然后通过VSPerfCmd /attach:xxxx把Profiler attach到IIS中 通过VSPerfCmd /globalon重新让Profiler进行性能数据的采集 然后就可以运行性能测试的场景 运行测试完毕以后就用VSPerfCmd /globaloff停止性能数据的采集 接着用VSPerfCmd [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/' rel='bookmark' title='Permanent Link: 用VSTS Profiler发现性能问题并且进行优化实例'>用VSTS Profiler发现性能问题并且进行优化实例</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/' rel='bookmark' title='Permanent Link: 用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息'>用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/vsts2010-test-edition-article-collection/' rel='bookmark' title='Permanent Link: VSTS 2010 Test Edition文章收集'>VSTS 2010 Test Edition文章收集</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://msdn.microsoft.com/zh-cn/library/47f7hz7y.aspx" target="_blank">MSDN文档</a>中，对于VSTS中的Development Edition的介绍主要分两大块，第一是“编写高质量的代码”，第二就是“使用分析工具对应用程序性能进行分析”。在VSTS里面有一个工具，叫Profiler，这个工具可以帮助研发人员在程序运行的过程中收集相关的数据，并且对之进行分析，从而达到帮助实现性能调优的目的。本文讲述如何在使用命令行工具来对ASP.NET程序进行性能测试相关数据的收集。</p>
<p>在VSTS的Profiler中，有两种(VSTS2010好像有5种了)Profiling的方法，第一种是采样(Sampling)，第二种是检测(Instrumentation)。对于采样模式，它的工作原理是Profiler定期中断CPU并且收集函数的调用堆栈信息。在网上找到一个图，对于采样工作方式的描述非常清晰：</p>
<p><img class="alignnone size-full wp-image-429" title="how-sampling-works" src="http://magustest.com/blog/wp-content/uploads/2009/04/how-sampling-works1.jpg" alt="how-sampling-works" width="500" height="330" /></p>
<p>对于检测模式，他的工作原理是用VSInstr程序在原始的代码中插入一些用于计算时间的代码，例如A函数调用B函数，那么在调用B函数的前后都会被插入用于计算时间的代码，具体可以看下图：<br />
<span id="more-426"></span><br />
<img class="alignnone size-full wp-image-430" title="how-instr-works" src="http://magustest.com/blog/wp-content/uploads/2009/04/how-instr-works1.jpg" alt="how-instr-works" width="600" height="300" /></p>
<p>下面我自己写了一个小的Sample类，然后把编译好的代码用Reflector来查看，很容易地就能看出区别。第一个图是没有经过VSInstr处理的原始代码：</p>
<p><img class="alignnone size-full wp-image-431" title="before-instr" src="http://magustest.com/blog/wp-content/uploads/2009/04/before-instr1.png" alt="before-instr" width="351" height="274" /></p>
<p>下图就是经过VSInstr处理后，反编译后的代码：</p>
<p><img class="alignnone size-full wp-image-432" title="after-instr" src="http://magustest.com/blog/wp-content/uploads/2009/04/after-instr1.png" alt="after-instr" width="600" height="356" /></p>
<p>可以看到VSInstr程序修改了原来的DLL。在检测模式下，只有经过修改后的DLL才能收集到数据。</p>
<p>在VSTS中，一般可以通过Analyze菜单下的Launch Performance Wizard来新建一个性能会话，然后进行性能数据的采集。</p>
<p><span style="font-size: medium;"><strong>对于ASP.NET程序，可以通过以下步骤来进行“采样”</strong></span></p>
<blockquote><p>iisreset /stop<br />
VSPerfClrEnv /globalsampleon<br />
VSPerfCmd /start:sample /user:&#8221;NETWORK SERVICE&#8221; /output:&#8221;d:\somewhere\xxxx.vsp&#8221;<br />
VSPerfCmd /globaloff<br />
iisreset /start<br />
VSPerfCmd /attach:xxxx<br />
VSPerfCmd /globalon</p>
<p>&#8211;run the test scenario&#8211;</p>
<p>VSPerfCmd /globaloff<br />
VSPerfCmd /detach<br />
iisreset /stop<br />
VSPerfCmd /shutdown</p></blockquote>
<ol>
<li>第一步是停掉IIS</li>
<li>然后通过VSPerfClrEnv对环境变量进行设置，具体可以查文档，做完这一步以后通常需要重启一下电脑</li>
<li>第三步就是通过VSPerfCmd启动性能数据收集</li>
<li>接下来的VSPerfCmd /globaloff就是暂停性能数据的收集</li>
<li>然后重启IIS，并且访问一下这个服务器上的页面，使得W3WP进程启动</li>
<li>查看W3WP.EXE的进程ID，然后通过VSPerfCmd /attach:xxxx把Profiler attach到IIS中</li>
<li>通过VSPerfCmd /globalon重新让Profiler进行性能数据的采集</li>
<li>然后就可以运行性能测试的场景</li>
<li>运行测试完毕以后就用VSPerfCmd /globaloff停止性能数据的采集</li>
<li>接着用VSPerfCmd /detach让Profiler不要附着在IIS上</li>
<li>停掉IIS &#8212; iisreset /stop</li>
<li>执行VSPerfCmd /shutdown，这一步执行完毕以后，在d:\somewhere\下就有一个xxxx.vsp的性能报告。</li>
</ol>
<p><span style="font-size: medium;"><strong>对于ASP.NET程序，可以通过以下步骤来进行“检测”</strong></span></p>
<p>检测和采样其实是大同小异的，但是有一个关键的步骤就是在进行检测之前，一定要记得用VSInstr命令对需要进行检测的DLL或者EXE文件进行处理，建议一次不要检测太多文件，检测时间不要太长，因为检测所产生的数量是非常大的，产生的文件大小都是按G级别计算了。</p>
<blockquote><p>iisreset /stop<br />
VSPerfClrEnv /globaltraceon<br />
VSPerfCmd /start:trace /user:&#8221;NETWORK SERVICE&#8221; /CS /output:&#8221;d:\xxx\0422.vsp&#8221;<br />
VSPerfCmd /globaloff<br />
iisreset /start<br />
&#8211; 预热 &#8211;<br />
VSPerfCmd /globalon</p>
<p>&#8211;run code&#8211;</p>
<p>VSPerfCmd /globaloff<br />
iisreset /stop<br />
VSPerfCmd /shutdown</p></blockquote>
<p>重复一次，在做以上的步骤之前必须要用VSInstr对目标二进制文件进行处理。这里详细步骤就不做解释了，命令的主要区别就是在做检测的时候，就免去了Attach到IIS这个步骤了。</p>
<p>采样和检测，前者是宏观的性能数据采集，后者是微观的性能数据采集。对于CPU负载较高的程序，用采样会得到比较好的效果；但是如果程序运行过程中并没有消耗很多的CPU资源，那么用采样可能就不能收集到太多有用的信息。所以在不同的场景下需要应用不同的性能数据收集方法。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&amp;annotation=%E5%9C%A8MSDN%E6%96%87%E6%A1%A3%E4%B8%AD%EF%BC%8C%E5%AF%B9%E4%BA%8EVSTS%E4%B8%AD%E7%9A%84Development%20Edition%E7%9A%84%E4%BB%8B%E7%BB%8D%E4%B8%BB%E8%A6%81%E5%88%86%E4%B8%A4%E5%A4%A7%E5%9D%97%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%98%AF%E2%80%9C%E7%BC%96%E5%86%99%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81%E2%80%9D%EF%BC%8C%E7%AC%AC%E4%BA%8C%E5%B0%B1%E6%98%AF%E2%80%9C%E4%BD%BF%E7%94%A8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E5%AF%B9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%80%A7%E8%83%BD%E8%BF%9B%E8%A1%8C%E5%88%86%E6%9E%90%E2%80%9D%E3%80%82%E5%9C%A8VSTS%E9%87%8C%E9%9D%A2%E6%9C%89%E4%B8%80%E4%B8%AA%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8F%ABProfiler%EF%BC%8C%E8%BF%99%E4%B8%AA%E5" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&amp;bodytext=%E5%9C%A8MSDN%E6%96%87%E6%A1%A3%E4%B8%AD%EF%BC%8C%E5%AF%B9%E4%BA%8EVSTS%E4%B8%AD%E7%9A%84Development%20Edition%E7%9A%84%E4%BB%8B%E7%BB%8D%E4%B8%BB%E8%A6%81%E5%88%86%E4%B8%A4%E5%A4%A7%E5%9D%97%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%98%AF%E2%80%9C%E7%BC%96%E5%86%99%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81%E2%80%9D%EF%BC%8C%E7%AC%AC%E4%BA%8C%E5%B0%B1%E6%98%AF%E2%80%9C%E4%BD%BF%E7%94%A8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E5%AF%B9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%80%A7%E8%83%BD%E8%BF%9B%E8%A1%8C%E5%88%86%E6%9E%90%E2%80%9D%E3%80%82%E5%9C%A8VSTS%E9%87%8C%E9%9D%A2%E6%9C%89%E4%B8%80%E4%B8%AA%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8F%ABProfiler%EF%BC%8C%E8%BF%99%E4%B8%AA%E5" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&amp;notes=%E5%9C%A8MSDN%E6%96%87%E6%A1%A3%E4%B8%AD%EF%BC%8C%E5%AF%B9%E4%BA%8EVSTS%E4%B8%AD%E7%9A%84Development%20Edition%E7%9A%84%E4%BB%8B%E7%BB%8D%E4%B8%BB%E8%A6%81%E5%88%86%E4%B8%A4%E5%A4%A7%E5%9D%97%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%98%AF%E2%80%9C%E7%BC%96%E5%86%99%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81%E2%80%9D%EF%BC%8C%E7%AC%AC%E4%BA%8C%E5%B0%B1%E6%98%AF%E2%80%9C%E4%BD%BF%E7%94%A8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E5%AF%B9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%80%A7%E8%83%BD%E8%BF%9B%E8%A1%8C%E5%88%86%E6%9E%90%E2%80%9D%E3%80%82%E5%9C%A8VSTS%E9%87%8C%E9%9D%A2%E6%9C%89%E4%B8%80%E4%B8%AA%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8F%ABProfiler%EF%BC%8C%E8%BF%99%E4%B8%AA%E5" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;t=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F&amp;title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&amp;body=%E5%9C%A8MSDN%E6%96%87%E6%A1%A3%E4%B8%AD%EF%BC%8C%E5%AF%B9%E4%BA%8EVSTS%E4%B8%AD%E7%9A%84Development%20Edition%E7%9A%84%E4%BB%8B%E7%BB%8D%E4%B8%BB%E8%A6%81%E5%88%86%E4%B8%A4%E5%A4%A7%E5%9D%97%EF%BC%8C%E7%AC%AC%E4%B8%80%E6%98%AF%E2%80%9C%E7%BC%96%E5%86%99%E9%AB%98%E8%B4%A8%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81%E2%80%9D%EF%BC%8C%E7%AC%AC%E4%BA%8C%E5%B0%B1%E6%98%AF%E2%80%9C%E4%BD%BF%E7%94%A8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7%E5%AF%B9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%80%A7%E8%83%BD%E8%BF%9B%E8%A1%8C%E5%88%86%E6%9E%90%E2%80%9D%E3%80%82%E5%9C%A8VSTS%E9%87%8C%E9%9D%A2%E6%9C%89%E4%B8%80%E4%B8%AA%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8F%ABProfiler%EF%BC%8C%E8%BF%99%E4%B8%AA%E5" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=VSTS%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7Profiler%E7%9A%84%E4%BB%8B%E7%BB%8D%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintruduction-to-vsts-profile%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/using-vsts-profiler-find-bottleneck-and-optimize/' rel='bookmark' title='Permanent Link: 用VSTS Profiler发现性能问题并且进行优化实例'>用VSTS Profiler发现性能问题并且进行优化实例</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/collecting-aspnet-code-coverage-date-using-vsperfmon/' rel='bookmark' title='Permanent Link: 用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息'>用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/vsts2010-test-edition-article-collection/' rel='bookmark' title='Permanent Link: VSTS 2010 Test Edition文章收集'>VSTS 2010 Test Edition文章收集</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/intruduction-to-vsts-profile/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>利用序列化和反序列化实现深拷贝</title>
		<link>http://magustest.com/blog/net/serialize-deserialize-implement-deep-copy/</link>
		<comments>http://magustest.com/blog/net/serialize-deserialize-implement-deep-copy/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 06:24:05 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=389</guid>
		<description><![CDATA[假如说有一个简单的类，只有2个属性，那么可以用比较简单的方法实现深拷贝。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 &#91;Serializable&#93; public class Person &#123; public int Height &#123; get; set; &#125; public string FirstName &#123; get; set; &#125; &#125; &#160; class Program &#123; static void Main&#40;string&#91;&#93; args&#41; &#123; //实例化一个对象 Person PersonOne = new Person&#40;&#41;; [...]


Related posts:<ol><li><a href='http://magustest.com/blog/whiteboxtesting/introduction-to-pex-automated-white-box-testing-for-dotnet/' rel='bookmark' title='Permanent Link: PEX-.NET自动化白盒测试工具的介绍(1)'>PEX-.NET自动化白盒测试工具的介绍(1)</a></li>
<li><a href='http://magustest.com/blog/net/linq-type-convert/' rel='bookmark' title='Permanent Link: LINQ查询操作中的类型关系'>LINQ查询操作中的类型关系</a></li>
<li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>假如说有一个简单的类，只有2个属性，那么可以用比较简单的方法实现深拷贝。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>Serializable<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Height <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> FirstName <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">class</span> Program <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//实例化一个对象</span>
        Person PersonOne <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        PersonOne.<span style="color: #0000FF;">FirstName</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;John&quot;</span><span style="color: #008000;">;</span>
        PersonOne.<span style="color: #0000FF;">Height</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//深拷贝</span>
        Person DeepCopyPerson <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        DeepCopyPerson.<span style="color: #0000FF;">FirstName</span> <span style="color: #008000;">=</span> PersonOne.<span style="color: #0000FF;">FirstName</span><span style="color: #008000;">;</span>
        DeepCopyPerson.<span style="color: #0000FF;">Height</span> <span style="color: #008000;">=</span> PersonOne.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p><span id="more-389"></span><br />
代码中的DeepCopyPerson对象就是对PersonOne对象的一个深拷贝。其实还可以用序列化和反序列化的方法来实现对对象的深拷贝。Person类的[Serializable]属性是为了下面介绍序列化反序列化方法做深拷贝而做的准备，在这里没什么特别含义。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> T DeepCopy<span style="color: #008000;">&lt;</span>t<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>T obj<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">object</span> retval<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>MemoryStream ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        BinaryFormatter bf <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BinaryFormatter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//序列化成流</span>
        bf.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span>ms, obj<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        ms.<span style="color: #0000FF;">Seek</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">0</span>, SeekOrigin.<span style="color: #0000FF;">Begin</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//反序列化成对象</span>
        retval <span style="color: #008000;">=</span> bf.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        ms.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span>retval<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #008000;">&lt;/</span>t<span style="color: #008000;">&gt;</span></pre></td></tr></table></div>

<p>用的时候就是：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">class</span> Program <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//实例化一个对象</span>
        Person PersonOne <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        PersonOne.<span style="color: #0000FF;">FirstName</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;John&quot;</span><span style="color: #008000;">;</span>
        PersonOne.<span style="color: #0000FF;">Height</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//深拷贝</span>
        Person DeepCopyPerson <span style="color: #008000;">=</span> DeepCopy<span style="color: #008000;">&lt;</span>person<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>PersonOne<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #008000;">&lt;/</span>person<span style="color: #008000;">&gt;</span></pre></td></tr></table></div>

<p>只要一个类被声明为可序列化的（就是带有[Serializable]标签），就可以用这个方法来进行深拷贝。记下来，免得以后自己忘记了。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&amp;annotation=%E5%81%87%E5%A6%82%E8%AF%B4%E6%9C%89%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%B1%BB%EF%BC%8C%E5%8F%AA%E6%9C%892%E4%B8%AA%E5%B1%9E%E6%80%A7%EF%BC%8C%E9%82%A3%E4%B9%88%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%AF%94%E8%BE%83%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D%E3%80%82%0D%0A%0D%0A%5BSerializable%5D%0D%0Apublic%20class%20Person%0D%0A%7B%0D%0A%20%20%20%20public%20int%20Height%20%7B%20get%3B%20set%3B%20%7D%0D%0A%20%20%20%20public%20string%20FirstName%20%7B%20get%3B%20set%3B%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Program%20%7B" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&amp;bodytext=%E5%81%87%E5%A6%82%E8%AF%B4%E6%9C%89%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%B1%BB%EF%BC%8C%E5%8F%AA%E6%9C%892%E4%B8%AA%E5%B1%9E%E6%80%A7%EF%BC%8C%E9%82%A3%E4%B9%88%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%AF%94%E8%BE%83%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D%E3%80%82%0D%0A%0D%0A%5BSerializable%5D%0D%0Apublic%20class%20Person%0D%0A%7B%0D%0A%20%20%20%20public%20int%20Height%20%7B%20get%3B%20set%3B%20%7D%0D%0A%20%20%20%20public%20string%20FirstName%20%7B%20get%3B%20set%3B%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Program%20%7B" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&amp;notes=%E5%81%87%E5%A6%82%E8%AF%B4%E6%9C%89%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%B1%BB%EF%BC%8C%E5%8F%AA%E6%9C%892%E4%B8%AA%E5%B1%9E%E6%80%A7%EF%BC%8C%E9%82%A3%E4%B9%88%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%AF%94%E8%BE%83%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D%E3%80%82%0D%0A%0D%0A%5BSerializable%5D%0D%0Apublic%20class%20Person%0D%0A%7B%0D%0A%20%20%20%20public%20int%20Height%20%7B%20get%3B%20set%3B%20%7D%0D%0A%20%20%20%20public%20string%20FirstName%20%7B%20get%3B%20set%3B%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Program%20%7B" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;t=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F&amp;title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&amp;body=%E5%81%87%E5%A6%82%E8%AF%B4%E6%9C%89%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%B1%BB%EF%BC%8C%E5%8F%AA%E6%9C%892%E4%B8%AA%E5%B1%9E%E6%80%A7%EF%BC%8C%E9%82%A3%E4%B9%88%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%AF%94%E8%BE%83%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D%E3%80%82%0D%0A%0D%0A%5BSerializable%5D%0D%0Apublic%20class%20Person%0D%0A%7B%0D%0A%20%20%20%20public%20int%20Height%20%7B%20get%3B%20set%3B%20%7D%0D%0A%20%20%20%20public%20string%20FirstName%20%7B%20get%3B%20set%3B%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Program%20%7B" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E5%88%A9%E7%94%A8%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fserialize-deserialize-implement-deep-copy%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/whiteboxtesting/introduction-to-pex-automated-white-box-testing-for-dotnet/' rel='bookmark' title='Permanent Link: PEX-.NET自动化白盒测试工具的介绍(1)'>PEX-.NET自动化白盒测试工具的介绍(1)</a></li>
<li><a href='http://magustest.com/blog/net/linq-type-convert/' rel='bookmark' title='Permanent Link: LINQ查询操作中的类型关系'>LINQ查询操作中的类型关系</a></li>
<li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/serialize-deserialize-implement-deep-copy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>单元测试中三种准备Test Fixture的方法比较</title>
		<link>http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/</link>
		<comments>http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 10:09:19 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[白盒测试]]></category>
		<category><![CDATA[软件测试]]></category>
		<category><![CDATA[单元测试]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=375</guid>
		<description><![CDATA[首先说一下Test Fixture，我不知道怎么样翻译这个Test Fixture，没能搜到一个翻译的比较合适的。最让我气愤的是某人翻译的一本书中，直接把Test Fixture翻译成为测试夹具，这明显就是什么词霸词典硬翻译出来的，我强烈鄙视这样不负责任的翻译行为。 The test fixture is everything we need to have in place to exercise the SUT 我觉得这是一个对Test Fixture的一个很清晰明了的定义，就是运行被测软件所需要的一切东西，这个“东西”不单只是数据，同时还包括对被测软件的准备，例如实例化某个被测方法所在的类，准备数据库的ConnectionString等。通常来说，有三种方法来准备Test Fixture。 1. 内联方式：这种方式就是直接在测试方法中编写准备Test Fixture的代码。用这种方法的缺点是很容易造成代码的重复，出现很多复制粘贴的代码。同时，如果这个SETUP的过程比较复杂，也会降低测试代码的可读性，可维护性。另外的一个问题就是，这种方法很容易会带来测试数据Hard code的隐患。既然有那么多缺点，这种方法还有什么生命力呢？首先，可能对于初学者来说，这种方法是最简单的；其次，在一些只需要准备简单的Test Fixture的场合中，这种方法还是给编写测试的人提供了便利。 2. 委托方式：简单来说就是把Test Fixture的准备抽取为一个外部的方法，然后在需要的时候进行调用。这种方式的好处就是使得测试代码可读性更强，并且这部分的SETUP代码可以重用。而且这种做法可以屏蔽对SETUP过程的认知，使得测试人员的关注点落在真正的测试代码上面，而不是如何SETUP。 3. 隐式方式：很多xUnit框架的实现都提供了不同的隐式SETUP和TEARDOWN。例如MSTEST里面的[TestInitialize]和[TestCleanup]标签，就提供了一种隐式准备Test Fixture的支持。就是在每一个测试方法运行前，都会执行一次标有[TestInitialize]标签的方法。使用这种方法的好处就是写一次就能在各个测试中都实现了Test Fixture的准备，不用每次都显示地调用一个外部方法，不过缺点也不少： 可能会令测试比较难懂，因为这些隐式调用不是必须的，有可能会被遗漏掉。 不能使用哦本地变量来保存对象，只能用test class 里面的filed或者property 变相地使用了全局变量 在做单元测试的过程中，需要灵活地运用这三种Test Fixture的准备方法。例如在我的工作当中，我在以下情况使用到了隐式准备方式： 在某一个测试项目中，由于测试的数据不多，所以我使用了XmlSerializer，把测试的数据都放在一个XML文件中，然后利用XmlSerializer把XML中的数据映射到相应的配置类中。对于这样的情况，这些测试数据在测试运行的全过程中都需要用到，所以我选择了在测试类初始化的时候，只运行1次，来准备这些测试数据（Test Fixture的一部分）。 1 2 3 4 5 6 7 &#91;ClassInitialize&#40;&#41;&#93; public static void MyClassInitialize&#40;TestContext [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/automationtesting/data-driven-codedui-test/' rel='bookmark' title='Permanent Link: 实现数据驱动的CodedUI Test'>实现数据驱动的CodedUI Test</a></li>
<li><a href='http://magustest.com/blog/net/aspnet-web-config-priority/' rel='bookmark' title='Permanent Link: ASP.NET中配置文件web.config的优先级'>ASP.NET中配置文件web.config的优先级</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>首先说一下Test Fixture，我不知道怎么样翻译这个Test Fixture，没能搜到一个翻译的比较合适的。最让我气愤的是某人翻译的一本书中，直接把Test Fixture翻译成为测试夹具，这明显就是什么词霸词典硬翻译出来的，我强烈鄙视这样不负责任的翻译行为。</p>
<p>The test fixture is everything we need to have in place to exercise the SUT</p>
<p>我觉得这是一个对Test Fixture的一个很清晰明了的定义，就是运行被测软件所需要的一切东西，这个“东西”不单只是数据，同时还包括对被测软件的准备，例如实例化某个被测方法所在的类，准备数据库的ConnectionString等。通常来说，有三种方法来准备Test Fixture。</p>
<p>1. 内联方式：这种方式就是直接在测试方法中编写准备Test Fixture的代码。用这种方法的缺点是很容易造成代码的重复，出现很多复制粘贴的代码。同时，如果这个SETUP的过程比较复杂，也会降低测试代码的可读性，可维护性。另外的一个问题就是，这种方法很容易会带来测试数据Hard code的隐患。既然有那么多缺点，这种方法还有什么生命力呢？首先，可能对于初学者来说，这种方法是最简单的；其次，在一些只需要准备简单的Test Fixture的场合中，这种方法还是给编写测试的人提供了便利。<br />
<span id="more-375"></span><br />
2. 委托方式：简单来说就是把Test Fixture的准备抽取为一个外部的方法，然后在需要的时候进行调用。这种方式的好处就是使得测试代码可读性更强，并且这部分的SETUP代码可以重用。而且这种做法可以屏蔽对SETUP过程的认知，使得测试人员的关注点落在真正的测试代码上面，而不是如何SETUP。</p>
<p>3. 隐式方式：很多xUnit框架的实现都提供了不同的隐式SETUP和TEARDOWN。例如MSTEST里面的[TestInitialize]和[TestCleanup]标签，就提供了一种隐式准备Test Fixture的支持。就是在每一个测试方法运行前，都会执行一次标有[TestInitialize]标签的方法。使用这种方法的好处就是写一次就能在各个测试中都实现了Test Fixture的准备，不用每次都显示地调用一个外部方法，不过缺点也不少：</p>
<ul>
<li>可能会令测试比较难懂，因为这些隐式调用不是必须的，有可能会被遗漏掉。</li>
<li> 不能使用哦本地变量来保存对象，只能用test class 里面的filed或者property</li>
<li> 变相地使用了全局变量</li>
</ul>
<p>在做单元测试的过程中，需要灵活地运用这三种Test Fixture的准备方法。例如在我的工作当中，我在以下情况使用到了隐式准备方式：</p>
<p>在某一个测试项目中，由于测试的数据不多，所以我使用了XmlSerializer，把测试的数据都放在一个XML文件中，然后利用XmlSerializer把XML中的数据映射到相应的配置类中。对于这样的情况，这些测试数据在测试运行的全过程中都需要用到，所以我选择了在测试类初始化的时候，只运行1次，来准备这些测试数据（Test Fixture的一部分）。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>ClassInitialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> MyClassInitialize<span style="color: #000000;">&#40;</span>TestContext testContext<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    XmlSerializer xmlSerializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XmlSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Config<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    FileStream fs <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> FileStream<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Config.xml&quot;</span>, FileMode.<span style="color: #0000FF;">Open</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    config <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Config<span style="color: #000000;">&#41;</span>xmlSerializer.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>fs<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>还是在同一个项目中，我想让每一个测试之间互相不要受到影响，所以我在[TestInitialize()]方法中对于一个Web Service的客户端进行初始化，保证每一次运行测试前，这个客户端都是“新”的</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>TestInitialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> MyTestInitialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   USi18nService <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> InteropWebSerivce<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   USi18nService.<span style="color: #0000FF;">Url</span> <span style="color: #008000;">=</span> config.<span style="color: #0000FF;">USi18nAddress</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>在另外的一个项目中，需要对一个方法进行测试，该方法的功能是根据Email地址从PreSignup表里面获取相关的资料，那么首先要做的就是完成一个PreSignup的操作，才能检查这个方法。而完成PreSignup操作并不是所有的测试都需要的，所以我不选择隐式调用，而是选择委托调用，调用一个外部的帮助方法，来帮助我完成PreSignup操作；同时这个PreSignup的操作在其他一些测试中也是需要的，所以也达到了重用的效果。</p>
<p>那么在什么时候会用到内联方法来准备Test Fixture呢？其实我自己经常用这种方法，有以下一个场景，我需要对一个方法进行测试，这个方法要做的事情就是检查一个电话号码是否符合规范，那么我就会先创建一个List，然后在List里面填充了各种不同的电话号码，然后在后面用一个foreach语句把List里面的数据遍历一遍，可能这些电话号码的数据只在这一个方法里面才有用，所以我没有选择把它抽取成一个方法。</p>
<p>其实不同的单元测试框架有不同的思想，例如在NUnit里面，一个测试类的标签就是叫[Test Fixture]，其实作者的设计思想就是一个测试类，就是一套Test Fixture；如果不是一套Test Fixture，那么不要把测试方法写到一起。其实这三种方法各有所长，在我刚开始学习和尝试做单元测试的时候，我刚接触到类似[Setup][TearDown]这样的隐式调用的时候，我觉得这就是银弹，我要充分使用它。但是随着工作的深入，发现这个隐式调用会带来一些问题，然后就慢慢转用了调外部方法，或者直接内联到测试方法中。只有结合实际情况，结合的上下文来运用这些方法，才能真正提高单元测试代码的质量，减少我们的工作量。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F&amp;t=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F&title=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F&title=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F&amp;title=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%B8%89%E7%A7%8D%E5%87%86%E5%A4%87Test%20Fixture%E7%9A%84%E6%96%B9%E6%B3%95%E6%AF%94%E8%BE%83%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fthree-different-test-fixture-setup-approach%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/automationtesting/data-driven-codedui-test/' rel='bookmark' title='Permanent Link: 实现数据驱动的CodedUI Test'>实现数据驱动的CodedUI Test</a></li>
<li><a href='http://magustest.com/blog/net/aspnet-web-config-priority/' rel='bookmark' title='Permanent Link: ASP.NET中配置文件web.config的优先级'>ASP.NET中配置文件web.config的优先级</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET平台上的Memcached客户端介绍</title>
		<link>http://magustest.com/blog/net/introduction-to-dotnet-memcached-client/</link>
		<comments>http://magustest.com/blog/net/introduction-to-dotnet-memcached-client/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 08:50:52 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=364</guid>
		<description><![CDATA[早上接到一个任务，需要对Linux服务器的Memcached的update操作进行性能测试，我发现我是一个典型的“手里拿着锤子，就把所有问题都当成钉子”的人。我第一个念头就是，上Memcached的官网找.NET的客户端。最后在Codeplex上找到了一个叫Memcached Providers的客户端程序，很小，218K，里面就3个DLL,一个是Memcached Providers本身的DLL，还有一个是Enyim.Caching，Enyim.Caching也是一个.NET平台上的Memcached客户端，最后就是著名的log4net。 Memcached Providers的配置很方便，首先就是在.NET项目中引用上述提到的3个DLL文件，然后就需要修改项目的配置文件，如果是桌面程序，就修改APP.CONFIG，如果是WEB程序，就修改WEB.CONFIG。 首先在configSections节点下增加如下配置 1 2 3 4 5 6 &#60;section name=&#34;cacheProvider&#34; type=&#34;MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders&#34; allowDefinition=&#34;MachineToApplication&#34; restartOnExternalChanges=&#34;true&#34;/&#62; &#60;sectionGroup name=&#34;enyim.com&#34;&#62; &#60;section name=&#34;memcached&#34; type=&#34;Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching&#34; /&#62; &#60;/sectionGroup&#62; &#60;section name=&#34;log4net&#34; type=&#34;log4net.Config.Log4NetConfigurationSectionHandler,log4net&#34;/&#62; 接着在configuration节点下增加Enyim的配置节点 1 2 3 4 5 6 7 8 9 &#60;enyim.com&#62; &#60;memcached&#62; &#60;servers&#62; &#60;!-- put your own server(s) here--&#62; &#60;add address=&#34;10.60.0.105&#34; port=&#34;19191&#34; /&#62; &#60;/servers&#62; &#60;socketPool minPoolSize=&#34;10&#34; [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/' rel='bookmark' title='Permanent Link: 单元测试中三种准备Test Fixture的方法比较'>单元测试中三种准备Test Fixture的方法比较</a></li>
<li><a href='http://magustest.com/blog/net/aspnet-web-config-priority/' rel='bookmark' title='Permanent Link: ASP.NET中配置文件web.config的优先级'>ASP.NET中配置文件web.config的优先级</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>早上接到一个任务，需要对Linux服务器的Memcached的update操作进行性能测试，我发现我是一个典型的“手里拿着锤子，就把所有问题都当成钉子”的人。我第一个念头就是，上<a href="http://www.danga.com/memcached/" target="_blank">Memcached的官网</a>找.NET的客户端。最后在Codeplex上找到了一个叫<a href="http://memcachedproviders.codeplex.com/" target="_blank">Memcached Providers</a>的客户端程序，很小，218K，里面就3个DLL,一个是Memcached Providers本身的DLL，还有一个是Enyim.Caching，<a href="http://enyimmemcached.codeplex.com/" target="_blank">Enyim.Caching</a>也是一个.NET平台上的Memcached客户端，最后就是著名的log4net。</p>
<p>Memcached Providers的配置很方便，首先就是在.NET项目中引用上述提到的3个DLL文件，然后就需要修改项目的配置文件，如果是桌面程序，就修改APP.CONFIG，如果是WEB程序，就修改WEB.CONFIG。<br />
<span id="more-364"></span><br />
首先在configSections节点下增加如下配置</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;cacheProvider&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">allowDefinition</span>=<span style="color: #ff0000;">&quot;MachineToApplication&quot;</span> <span style="color: #000066;">restartOnExternalChanges</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sectionGroup</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;enyim.com&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;memcached&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sectionGroup<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;log4net&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;log4net.Config.Log4NetConfigurationSectionHandler,log4net&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>接着在configuration节点下增加Enyim的配置节点</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;enyim.com<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;memcached<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #808080; font-style: italic;">&lt;!-- put your own server(s) here--&gt;</span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">address</span>=<span style="color: #ff0000;">&quot;10.60.0.105&quot;</span> <span style="color: #000066;">port</span>=<span style="color: #ff0000;">&quot;19191&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;socketPool</span> <span style="color: #000066;">minPoolSize</span>=<span style="color: #ff0000;">&quot;10&quot;</span> <span style="color: #000066;">maxPoolSize</span>=<span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #000066;">connectionTimeout</span>=<span style="color: #ff0000;">&quot;00:00:10&quot;</span> <span style="color: #000066;">deadTimeout</span>=<span style="color: #ff0000;">&quot;00:02:00&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/memcached<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/enyim.com<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>在configuration节点下增加Memcached Providers的配置节点</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cacheProvider</span> <span style="color: #000066;">defaultProvider</span>=<span style="color: #ff0000;">&quot;MemcachedCacheProvider&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;providers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;MemcachedCacheProvider&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders&quot;</span></span>
<span style="color: #009900;">                <span style="color: #000066;">keySuffix</span>=<span style="color: #ff0000;">&quot;_MySuffix_&quot;</span> <span style="color: #000066;">defaultExpireTime</span>=<span style="color: #ff0000;">&quot;2000&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/providers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cacheProvider<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>最后就是在configuration节点下增加Log4net的配置节点</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;">/cacheProvider&gt;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;log4net<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appender</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ConsoleAppender&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;log4net.Appender.ConsoleAppender&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;layout</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;log4net.Layout.PatternLayout&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;conversionPattern</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;%date [%thread] %-5level %logger [%property{NDC}]- %message%newline&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/layout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;priority</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;WARN&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appender-ref</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;ConsoleAppender&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;log4net.Filter.LevelRangeFilter&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;levelMin</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;WARN&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;levelMax</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;FATAL&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appender-ref<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/log4net<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>最后做一个简单的测试</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>TestMethod<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> TestMethod1<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">string</span> key <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;mykey&quot;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">string</span> value <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Success!!!&quot;</span><span style="color: #008000;">;</span>
  DistCache.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>key, value<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                             <span style="color: #008080; font-style: italic;">//存数据</span>
  Thread.<span style="color: #0000FF;">Sleep</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">500</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">string</span> ret <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span>DistCache.<span style="color: #0000FF;">Get</span><span style="color: #000000;">&#40;</span>key<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>            <span style="color: #008080; font-style: italic;">//读数据</span>
  Assert.<span style="color: #0000FF;">AreEqual</span><span style="color: #000000;">&#40;</span>value, ret<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>                             <span style="color: #008080; font-style: italic;">//验证</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>整个过程下来比较顺利，基本没有遇到问题，这一切准备完毕以后就可以进入测试了。PHP，JAVA，Python等程序语言的Memcached客户端是比较多的，而.NET平台的客户端却只有2、3个，如果打算在.NET程序中使用Memcached，Memcached Providers也是一个不错的选择。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&amp;annotation=%E6%97%A9%E4%B8%8A%E6%8E%A5%E5%88%B0%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%EF%BC%8C%E9%9C%80%E8%A6%81%E5%AF%B9Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84Memcached%E7%9A%84update%E6%93%8D%E4%BD%9C%E8%BF%9B%E8%A1%8C%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%EF%BC%8C%E6%88%91%E5%8F%91%E7%8E%B0%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E2%80%9C%E6%89%8B%E9%87%8C%E6%8B%BF%E7%9D%80%E9%94%A4%E5%AD%90%EF%BC%8C%E5%B0%B1%E6%8A%8A%E6%89%80%E6%9C%89%E9%97%AE%E9%A2%98%E9%83%BD%E5%BD%93%E6%88%90%E9%92%89%E5%AD%90%E2%80%9D%E7%9A%84%E4%BA%BA%E3%80%82%E6%88%91%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%BF%B5%E5%A4%B4%E5%B0%B1%E6%98%AF%EF%BC%8C%E4%B8%8AMemcached%E7%9A%84%E5%AE%98%E7%BD%91%E6%89%BE.N" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&amp;bodytext=%E6%97%A9%E4%B8%8A%E6%8E%A5%E5%88%B0%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%EF%BC%8C%E9%9C%80%E8%A6%81%E5%AF%B9Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84Memcached%E7%9A%84update%E6%93%8D%E4%BD%9C%E8%BF%9B%E8%A1%8C%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%EF%BC%8C%E6%88%91%E5%8F%91%E7%8E%B0%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E2%80%9C%E6%89%8B%E9%87%8C%E6%8B%BF%E7%9D%80%E9%94%A4%E5%AD%90%EF%BC%8C%E5%B0%B1%E6%8A%8A%E6%89%80%E6%9C%89%E9%97%AE%E9%A2%98%E9%83%BD%E5%BD%93%E6%88%90%E9%92%89%E5%AD%90%E2%80%9D%E7%9A%84%E4%BA%BA%E3%80%82%E6%88%91%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%BF%B5%E5%A4%B4%E5%B0%B1%E6%98%AF%EF%BC%8C%E4%B8%8AMemcached%E7%9A%84%E5%AE%98%E7%BD%91%E6%89%BE.N" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&amp;notes=%E6%97%A9%E4%B8%8A%E6%8E%A5%E5%88%B0%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%EF%BC%8C%E9%9C%80%E8%A6%81%E5%AF%B9Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84Memcached%E7%9A%84update%E6%93%8D%E4%BD%9C%E8%BF%9B%E8%A1%8C%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%EF%BC%8C%E6%88%91%E5%8F%91%E7%8E%B0%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E2%80%9C%E6%89%8B%E9%87%8C%E6%8B%BF%E7%9D%80%E9%94%A4%E5%AD%90%EF%BC%8C%E5%B0%B1%E6%8A%8A%E6%89%80%E6%9C%89%E9%97%AE%E9%A2%98%E9%83%BD%E5%BD%93%E6%88%90%E9%92%89%E5%AD%90%E2%80%9D%E7%9A%84%E4%BA%BA%E3%80%82%E6%88%91%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%BF%B5%E5%A4%B4%E5%B0%B1%E6%98%AF%EF%BC%8C%E4%B8%8AMemcached%E7%9A%84%E5%AE%98%E7%BD%91%E6%89%BE.N" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;t=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F&amp;title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&amp;body=%E6%97%A9%E4%B8%8A%E6%8E%A5%E5%88%B0%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%EF%BC%8C%E9%9C%80%E8%A6%81%E5%AF%B9Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84Memcached%E7%9A%84update%E6%93%8D%E4%BD%9C%E8%BF%9B%E8%A1%8C%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%EF%BC%8C%E6%88%91%E5%8F%91%E7%8E%B0%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E2%80%9C%E6%89%8B%E9%87%8C%E6%8B%BF%E7%9D%80%E9%94%A4%E5%AD%90%EF%BC%8C%E5%B0%B1%E6%8A%8A%E6%89%80%E6%9C%89%E9%97%AE%E9%A2%98%E9%83%BD%E5%BD%93%E6%88%90%E9%92%89%E5%AD%90%E2%80%9D%E7%9A%84%E4%BA%BA%E3%80%82%E6%88%91%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%BF%B5%E5%A4%B4%E5%B0%B1%E6%98%AF%EF%BC%8C%E4%B8%8AMemcached%E7%9A%84%E5%AE%98%E7%BD%91%E6%89%BE.N" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=.NET%E5%B9%B3%E5%8F%B0%E4%B8%8A%E7%9A%84Memcached%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%8B%E7%BB%8D%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Fintroduction-to-dotnet-memcached-client%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/' rel='bookmark' title='Permanent Link: 单元测试中三种准备Test Fixture的方法比较'>单元测试中三种准备Test Fixture的方法比较</a></li>
<li><a href='http://magustest.com/blog/net/aspnet-web-config-priority/' rel='bookmark' title='Permanent Link: ASP.NET中配置文件web.config的优先级'>ASP.NET中配置文件web.config的优先级</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/introduction-to-dotnet-memcached-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET中配置文件web.config的优先级</title>
		<link>http://magustest.com/blog/net/aspnet-web-config-priority/</link>
		<comments>http://magustest.com/blog/net/aspnet-web-config-priority/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 06:20:37 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=340</guid>
		<description><![CDATA[web.config是ASP.NET的默认配置文件名，一般来说每个ASP.NET站点的根目录都会有一个web.config，因为在VS里面建立站点的时候会一同生成的。其实在一个站点的不同的目录中可以各自有各自的web.config文件，如果一个站点中的不同的目录都有web.config，那么他们之间的关系是什么？哪个web.config的优先级会高呢？顺序如下： (1) 如果在当前页面所在目录下存在web.config 文件，查看是否存在所要查找的结点名称，如果存在返回结果并停止查找。 (2) 如果当前页面所在目录下不存在web.config 文件或者web.config 文件中不存在该结点名，则查找它的上级目录，直到网站的根目录。 (3) 如果网站根目录下不存在web.config 文件或者web.config 文件中不存在该节点名则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config 文件中查找。 (4) 如果在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config 文件中不存在相应结点，则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG \machine.config 文件中查找。 (5) 如果仍然没有找到则返回null 。 由此可见，站点中某个文件夹里面的web.config文件的内容可以覆盖掉站点根目录的web.config，如果在开发或者测试的过程中需要对站点的某个部分的配置进行修改，可以根据这个优先级，用子目录下的配置文件覆盖站点根目录配置文件。 Share and Enjoy: Related posts:单元测试中三种准备Test Fixture的方法比较 用XSD自动生成XML对应的.NET实体类


Related posts:<ol><li><a href='http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/' rel='bookmark' title='Permanent Link: 单元测试中三种准备Test Fixture的方法比较'>单元测试中三种准备Test Fixture的方法比较</a></li>
<li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>web.config是ASP.NET的默认配置文件名，一般来说每个ASP.NET站点的根目录都会有一个web.config，因为在VS里面建立站点的时候会一同生成的。其实在一个站点的不同的目录中可以各自有各自的web.config文件，如果一个站点中的不同的目录都有web.config，那么他们之间的关系是什么？哪个web.config的优先级会高呢？顺序如下：<br />
(1) 如果在当前页面所在目录下存在web.config 文件，查看是否存在所要查找的结点名称，如果存在返回结果并停止查找。<br />
(2) 如果当前页面所在目录下不存在web.config 文件或者web.config 文件中不存在该结点名，则查找它的上级目录，直到网站的根目录。<br />
<span id="more-340"></span><br />
(3) 如果网站根目录下不存在web.config 文件或者web.config 文件中不存在该节点名则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config 文件中查找。<br />
(4) 如果在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config 文件中不存在相应结点，则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG \machine.config 文件中查找。<br />
(5) 如果仍然没有找到则返回null 。<br />
由此可见，站点中某个文件夹里面的web.config文件的内容可以覆盖掉站点根目录的web.config，如果在开发或者测试的过程中需要对站点的某个部分的配置进行修改，可以根据这个优先级，用子目录下的配置文件覆盖站点根目录配置文件。</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&amp;annotation=web.config%E6%98%AFASP.NET%E7%9A%84%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%8C%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E6%AF%8F%E4%B8%AAASP.NET%E7%AB%99%E7%82%B9%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E9%83%BD%E4%BC%9A%E6%9C%89%E4%B8%80%E4%B8%AAweb.config%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8VS%E9%87%8C%E9%9D%A2%E5%BB%BA%E7%AB%8B%E7%AB%99%E7%82%B9%E7%9A%84%E6%97%B6%E5%80%99%E4%BC%9A%E4%B8%80%E5%90%8C%E7%94%9F%E6%88%90%E7%9A%84%E3%80%82%E5%85%B6%E5%AE%9E%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%AB%99%E7%82%B9%E7%9A%84%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%90%84%E8%87%AA%E6%9C%89%E5%90%84%E8%87%AA%E7%9A%84web.con" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&amp;bodytext=web.config%E6%98%AFASP.NET%E7%9A%84%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%8C%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E6%AF%8F%E4%B8%AAASP.NET%E7%AB%99%E7%82%B9%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E9%83%BD%E4%BC%9A%E6%9C%89%E4%B8%80%E4%B8%AAweb.config%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8VS%E9%87%8C%E9%9D%A2%E5%BB%BA%E7%AB%8B%E7%AB%99%E7%82%B9%E7%9A%84%E6%97%B6%E5%80%99%E4%BC%9A%E4%B8%80%E5%90%8C%E7%94%9F%E6%88%90%E7%9A%84%E3%80%82%E5%85%B6%E5%AE%9E%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%AB%99%E7%82%B9%E7%9A%84%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%90%84%E8%87%AA%E6%9C%89%E5%90%84%E8%87%AA%E7%9A%84web.con" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&amp;notes=web.config%E6%98%AFASP.NET%E7%9A%84%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%8C%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E6%AF%8F%E4%B8%AAASP.NET%E7%AB%99%E7%82%B9%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E9%83%BD%E4%BC%9A%E6%9C%89%E4%B8%80%E4%B8%AAweb.config%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8VS%E9%87%8C%E9%9D%A2%E5%BB%BA%E7%AB%8B%E7%AB%99%E7%82%B9%E7%9A%84%E6%97%B6%E5%80%99%E4%BC%9A%E4%B8%80%E5%90%8C%E7%94%9F%E6%88%90%E7%9A%84%E3%80%82%E5%85%B6%E5%AE%9E%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%AB%99%E7%82%B9%E7%9A%84%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%90%84%E8%87%AA%E6%9C%89%E5%90%84%E8%87%AA%E7%9A%84web.con" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;t=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F&amp;title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&amp;body=web.config%E6%98%AFASP.NET%E7%9A%84%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%8C%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E6%AF%8F%E4%B8%AAASP.NET%E7%AB%99%E7%82%B9%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E9%83%BD%E4%BC%9A%E6%9C%89%E4%B8%80%E4%B8%AAweb.config%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8VS%E9%87%8C%E9%9D%A2%E5%BB%BA%E7%AB%8B%E7%AB%99%E7%82%B9%E7%9A%84%E6%97%B6%E5%80%99%E4%BC%9A%E4%B8%80%E5%90%8C%E7%94%9F%E6%88%90%E7%9A%84%E3%80%82%E5%85%B6%E5%AE%9E%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%AB%99%E7%82%B9%E7%9A%84%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%90%84%E8%87%AA%E6%9C%89%E5%90%84%E8%87%AA%E7%9A%84web.con" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=ASP.NET%E4%B8%AD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6web.config%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Faspnet-web-config-priority%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/whiteboxtesting/three-different-test-fixture-setup-approach/' rel='bookmark' title='Permanent Link: 单元测试中三种准备Test Fixture的方法比较'>单元测试中三种准备Test Fixture的方法比较</a></li>
<li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/aspnet-web-config-priority/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LINQ查询操作中的类型关系</title>
		<link>http://magustest.com/blog/net/linq-type-convert/</link>
		<comments>http://magustest.com/blog/net/linq-type-convert/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 04:10:14 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=333</guid>
		<description><![CDATA[最近在测试中，想尝试用LINQ来简化一下测试的代码，初步学习了一下LINQ，个人感觉需要认真理解查询操作中的类型关系，在阅读MSDN文档后写下了本文，主要参考MSDN讲述理解查询操作中的类型关系，还有对C# 3.0的一个新的关键字var的理解。 首先有一段LINQ查询表达式的代码 1 2 3 4 5 6 7 8 List&#60;onlineUser&#62; ret = AccountGateway.AccountLiteProvider.GetOnlineUsers&#40;1, 10000&#41;; var query = from onlineUser in ret where &#40;onlineUser.UserId &#62; 1301000200&#41; select onlineUser.UserId; foreach&#40;int iUser in query&#41; &#123; Console.WriteLine&#40;iUser.ToString&#40;&#41;&#41;; &#125; 这段代码首先查询出10000个在线用户，然后在这10000个在线用户中筛选出ID大于1301000200的用户ID。其中各个变量的类型如下： onlineUser &#8212; OnlineUser类 query &#8212; IEnumerable&#60;int&#62; iUser &#8212; int 下面可以看一下MSDN的详细说明： 数据源的类型参数决定范围变量的类型。 选择的对象的类型决定查询变量的类型。此处的 name 为一个字符串。因此，查询变量是一个 IEnumerable&#60;string&#62;。 在 foreach 语句中循环访问查询变量。因为查询变量是一个字符串序列，所以迭代变量也是一个字符串。 [...]


Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/' rel='bookmark' title='Permanent Link: Linq to Object在测试中的应用'>Linq to Object在测试中的应用</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>最近在测试中，想尝试用LINQ来简化一下测试的代码，初步学习了一下LINQ，个人感觉需要认真理解查询操作中的类型关系，在阅读MSDN文档后写下了本文，主要参考MSDN讲述理解查询操作中的类型关系，还有对C# 3.0的一个新的关键字var的理解。</p>
<p>首先有一段LINQ查询表达式的代码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">List<span style="color: #008000;">&lt;</span>onlineUser<span style="color: #008000;">&gt;</span> ret <span style="color: #008000;">=</span> AccountGateway.<span style="color: #0000FF;">AccountLiteProvider</span>.<span style="color: #0000FF;">GetOnlineUsers</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
var query <span style="color: #008000;">=</span> from onlineUser <span style="color: #0600FF;">in</span> ret
			where <span style="color: #000000;">&#40;</span>onlineUser.<span style="color: #0000FF;">UserId</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">1301000200</span><span style="color: #000000;">&#41;</span>
			select onlineUser.<span style="color: #0000FF;">UserId</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> iUser <span style="color: #0600FF;">in</span> query<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>iUser.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p><span id="more-333"></span><br />
这段代码首先查询出10000个在线用户，然后在这10000个在线用户中筛选出ID大于1301000200的用户ID。其中各个变量的类型如下：</p>
<ul>
<li>onlineUser &#8212;  OnlineUser类</li>
<li>query &#8212; IEnumerable&lt;int&gt;</li>
<li>iUser &#8212; int</li>
</ul>
<p>下面可以看一下MSDN的详细说明：</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-ienumerable1.png"><img class="alignnone size-full wp-image-335" title="linq-IEnumerable" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-ienumerable1.png" alt="" width="403" height="228" /></a></p>
<ol>
<li>数据源的类型参数决定范围变量的类型。</li>
<li>选择的对象的类型决定查询变量的类型。此处的 <span class="code">name</span> 为一个字符串。因此，查询变量是一个  <strong>IEnumerable</strong>&lt;string&gt;。</li>
<li>在 <span class="keyword">foreach</span> 语句中循环访问查询变量。因为查询变量是一个字符串序列，所以迭代变量也是一个字符串。</li>
</ol>
<p>下面这个例子跟本文刚开始的代码例子相似</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-data-conversion1.png"><img class="alignnone size-full wp-image-336" title="linq-data-conversion" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-data-conversion1.png" alt="" width="404" height="230" /></a></p>
<ol>
<li>数据源的类型参数决定范围变量的类型。</li>
<li><span class="keyword">select</span> 语句返回 <span class="code">Name</span> 属性，而非完整的  <span class="code">Customer</span> 对象。因为 <span class="code">Name</span> 是一个字符串，所以  <span class="code">custNameQuery</span> 的类型参数是 <span class="keyword">string</span>，而非 <span class="code">Customer</span>。</li>
<li>因为 <span class="code">custNameQuery</span> 是一个字符串序列，所以 <span class="keyword">foreach</span> 循环的迭代变量也必须是 <span class="keyword">string</span>。</li>
</ol>
<p>像上面这样做，有点不爽的就是每个变量类型都要编程的人来指定，C# 3.0还有一个新特性，就是隐式类型本地变量，也就是var关键字</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-impl-var1.png"><img class="alignnone size-full wp-image-337" title="linq-impl-var" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-impl-var1.png" alt="" width="403" height="227" /></a></p>
<ol>
<li>数据源的类型参数始终为查询中的范围变量的类型。</li>
<li>因为 <span class="code">select</span> 语句生成匿名类型，所以必须使用 <span class="keyword">var</span> 隐式类型化查询变量。</li>
<li>因为查询变量的类型是隐式的，所以 <span class="keyword">foreach</span> 循环中的迭代变量也必须是隐式的。</li>
</ol>
<p>到此，对LINQ查询操作中的类型关系也比较明白了吧。</p>
<p>一个变量被var关键字声明为隐式类型本地变量后，它并不是一个动态变量，C#动态变量要等4.0的dynamic关键字。那么这个var是什么呢？其实var也是一个强类型变量，它的类型是在编译时就已经确定下来了，并不是运行时才确定下来的。例如：</p>
<p>var s = &#8220;I am a string&#8221;;   //s的类型是string</p>
<p>var i = 88;                    //i的类型是int</p>
<p>s = 99;                         //编译出错，不能把一个int赋值给string类型变量</p>
<p>用Reflector看编译后的代码就是这样子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">List<span style="color: #008000;">&lt;</span>onlineUser<span style="color: #008000;">&gt;</span> ret <span style="color: #008000;">=</span> AccountGateway.<span style="color: #0000FF;">AccountLiteProvider</span>.<span style="color: #0000FF;">GetOnlineUsers</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> query <span style="color: #008000;">=</span> from onlineUser <span style="color: #0600FF;">in</span> ret
			where onlineUser.<span style="color: #0000FF;">UserId</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">1301000200</span>
			select onlineUser.<span style="color: #0000FF;">UserId</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> iUser <span style="color: #0600FF;">in</span> query<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>iUser.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>稍微总结一下var</p>
<ul>
<li>var还是强类型变量，不是弱类型变量</li>
<li>使用var不会带来性能损失，因为编译为IL以后，变量的类型已经是确定，不是在运行时通过反射获取类型。</li>
</ul>
<p>再最后，C#3.0, 3.5的很多新特性感觉都是为LINQ而出现的，例如：隐式类型化本地变量，匿名函数，匿名类，lambda表达式，扩展方法……</p>
<p>本文参考MSDN：http://msdn.microsoft.com/zh-cn/library/bb397924.aspx</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;annotation=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;bodytext=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;notes=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;t=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;body=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/' rel='bookmark' title='Permanent Link: Linq to Object在测试中的应用'>Linq to Object在测试中的应用</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/linq-type-convert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
