<?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; python</title>
	<atom:link href="http://magustest.com/blog/tag/python/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>DSL与自动化测试 &#8211; 用Python实现简单的DSL</title>
		<link>http://magustest.com/blog/automationtesting/dsl-automation-testing-using-python/</link>
		<comments>http://magustest.com/blog/automationtesting/dsl-automation-testing-using-python/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 06:15:32 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[自动化测试]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=655</guid>
		<description><![CDATA[自动化测试，一个在测试领域中被广为熟知，也是被谈论最多的概念之一。DSL (Domain Specific Language)，一种高度抽象，用于某个特定领域下编程语言。软件测试在大多数情况下都是对某个特定行业的软件系统进行测试，所以这两者应该可以很好的结合起来，事实上也是这样的，QTP里面的keyword view，其实就是DSL的一个实现。DSL一般可以分为两个大的类型，分别是External DSL 和 Internal DSL （引用自Martin Fowler）。External DSL 一般来说是跟其实现语言不一样的 DSL，常见的External DSL 有：SQL和XML配置文件；而Internal DSL 一般来说就是该DSL使用某个现成的编程语言（就是所谓的host language)，然后对host language进行一些改造而成。 我们在测试中会遇到很多问题，其中一些问题，几乎是所有公司所有团队都会遇到的，例如测试覆盖率不够，测试的时间不够等等。面对这些问题，自动化测试自然而然地成为解决这些问题的首选方法。但是自动化测试真的就是银弹麽？不见得！以前曾经在ASP.NET QA 的博客中给他们留言，请教过关于自动化测试的事情，我记得其中有一个回复是说，在某个release中过度地使用自动化测试，一切东西都想实现自动化测试，而忽略了产品本身的功能、特性的关注，结果就是超高的自动化测试覆盖率，但是很差的产品质量。大家都去实现自动化测试了，谁来做功能点的覆盖呢？某些领域的专家（SME），他们可能对测试技术是一无所知的，要把这些领域专家和测试实施结合起来，DSL就是一个比较好的桥梁。 我在工作中遇到的问题是，我需要测试一个类似UV（独立用户访问数）统计的系统，统计UV的方法其实就是根据_uid cookie的值来判断这个用户在某段时间内访问过我们的系统多少次，访问了哪些站点，进行了什么样的行为。其中有2个地方比较麻烦，第一就是在测试过程中要不断地拷贝cookie，这样拷来拷去两三次以后很容易就混乱，出错；第二就是需要记录访问哪些站点，这些站点都只是ID，也是需要不断地修改请求，测试时间长了也是很容易出错。所以我就打算在原来的测试工具基础上，实现一个简单的Internal DSL。先看成品： @tc def uniq_inventory_case01&#40;&#41;: test= testTool&#40;&#41; test.user&#40;'a'&#41;.view&#40;'asset55100002'&#41;.anetwork&#40;'55100'&#41;.onsite&#40;'site55100503'&#41;.snetwork&#40;'55100'&#41;.dnetwork&#40;'55100'&#41;.times&#40;1&#41;.go&#40;&#41; test.user&#40;'b'&#41;.view&#40;'asset55100002'&#41;.anetwork&#40;'55100'&#41;.onsite&#40;'site55100503'&#41;.snetwork&#40;'55100'&#41;.dnetwork&#40;'55100'&#41;.times&#40;2&#41;.go&#40;&#41; test.user&#40;'b'&#41;.view&#40;'asset55100002'&#41;.anetwork&#40;'55100'&#41;.onsite&#40;'site55100504_noad'&#41;.snetwork&#40;'55100'&#41;.dnetwork&#40;'55100'&#41;.times&#40;4&#41;.go&#40;&#41; 实例化一个testTool对象，然后就是指定哪个用户：user(&#8216;a&#8217;)或者user(&#8216;b&#8217;)，看的视频的ID：view(&#8216;asset55100002&#8242;)，这个视频属于哪个CRO呢？anetwork(&#8217;55100&#8242;)；放在哪个网站呢？onsite(&#8216;site55100503&#8242;)；网站是谁的呢？snetwork(&#8217;55100&#8242;)；谁是分发者呢？dnetwork(&#8217;55100&#8242;)；看了多少次呢？times(4)；最后一个有点儿丑陋的go()。 像这样子一句话里面N个方法连着用，就叫Method Chaining，Method Chaining通常可以让代码变得更加人性化，读起来更加容易。但是使用Method Chaining通常会遇到一个问题，就是很难判断就是到了哪个方法才是终结呢？是不是有些方法的调用是可选的，有些是必选的呢？其中一个解决方法就是我用到的，放一个.go()方法在最后，作为终结方法。要实现Method Chaining，其实只需要顶一个类，对于需要做连接的方法，最后都返回这个类的实例。例如： def view&#40;self, assetid&#41;: if assetid: self.asset_id = assetid return self &#160; def anetwork&#40;self, networkid&#41;: if [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>自动化测试，一个在测试领域中被广为熟知，也是被谈论最多的概念之一。DSL (Domain Specific Language)，一种高度抽象，用于某个特定领域下编程语言。软件测试在大多数情况下都是对某个特定行业的软件系统进行测试，所以这两者应该可以很好的结合起来，事实上也是这样的，QTP里面的keyword view，其实就是DSL的一个实现。DSL一般可以分为两个大的类型，分别是External DSL 和 Internal DSL （引用自Martin Fowler）。External DSL 一般来说是跟其实现语言不一样的 DSL，常见的External DSL 有：SQL和XML配置文件；而Internal DSL 一般来说就是该DSL使用某个现成的编程语言（就是所谓的host language)，然后对host language进行一些改造而成。</p>
<p>我们在测试中会遇到很多问题，其中一些问题，几乎是所有公司所有团队都会遇到的，例如测试覆盖率不够，测试的时间不够等等。面对这些问题，自动化测试自然而然地成为解决这些问题的首选方法。但是自动化测试真的就是银弹麽？不见得！以前曾经在ASP.NET QA 的博客中给他们留言，请教过关于自动化测试的事情，我记得其中有一个回复是说，在某个release中过度地使用自动化测试，一切东西都想实现自动化测试，而忽略了产品本身的功能、特性的关注，结果就是超高的自动化测试覆盖率，但是很差的产品质量。大家都去实现自动化测试了，谁来做功能点的覆盖呢？某些领域的专家（SME），他们可能对测试技术是一无所知的，要把这些领域专家和测试实施结合起来，DSL就是一个比较好的桥梁。</p>
<p>我在工作中遇到的问题是，我需要测试一个类似UV（独立用户访问数）统计的系统，统计UV的方法其实就是根据_uid cookie的值来判断这个用户在某段时间内访问过我们的系统多少次，访问了哪些站点，进行了什么样的行为。其中有2个地方比较麻烦，第一就是在测试过程中要不断地拷贝cookie，这样拷来拷去两三次以后很容易就混乱，出错；第二就是需要记录访问哪些站点，这些站点都只是ID，也是需要不断地修改请求，测试时间长了也是很容易出错。所以我就打算在原来的测试工具基础上，实现一个简单的Internal DSL。先看成品：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@tc
<span style="color: #ff7700;font-weight:bold;">def</span> uniq_inventory_case01<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">test</span>= testTool<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">test</span>.<span style="color: #dc143c;">user</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'a'</span><span style="color: black;">&#41;</span>.<span style="color: black;">view</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'asset55100002'</span><span style="color: black;">&#41;</span>.<span style="color: black;">anetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">onsite</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'site55100503'</span><span style="color: black;">&#41;</span>.<span style="color: black;">snetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">dnetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">times</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.<span style="color: black;">go</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">test</span>.<span style="color: #dc143c;">user</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'b'</span><span style="color: black;">&#41;</span>.<span style="color: black;">view</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'asset55100002'</span><span style="color: black;">&#41;</span>.<span style="color: black;">anetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">onsite</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'site55100503'</span><span style="color: black;">&#41;</span>.<span style="color: black;">snetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">dnetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">times</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>.<span style="color: black;">go</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">test</span>.<span style="color: #dc143c;">user</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'b'</span><span style="color: black;">&#41;</span>.<span style="color: black;">view</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'asset55100002'</span><span style="color: black;">&#41;</span>.<span style="color: black;">anetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">onsite</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'site55100504_noad'</span><span style="color: black;">&#41;</span>.<span style="color: black;">snetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">dnetwork</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'55100'</span><span style="color: black;">&#41;</span>.<span style="color: black;">times</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>.<span style="color: black;">go</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>实例化一个testTool对象，然后就是指定哪个用户：user(&#8216;a&#8217;)或者user(&#8216;b&#8217;)，看的视频的ID：view(&#8216;asset55100002&#8242;)，这个视频属于哪个CRO呢？anetwork(&#8217;55100&#8242;)；放在哪个网站呢？onsite(&#8216;site55100503&#8242;)；网站是谁的呢？snetwork(&#8217;55100&#8242;)；谁是分发者呢？dnetwork(&#8217;55100&#8242;)；看了多少次呢？times(4)；最后一个有点儿丑陋的go()。</p>
<p>像这样子一句话里面N个方法连着用，就叫Method Chaining，Method Chaining通常可以让代码变得更加人性化，读起来更加容易。但是使用Method Chaining通常会遇到一个问题，就是很难判断就是到了哪个方法才是终结呢？是不是有些方法的调用是可选的，有些是必选的呢？其中一个解决方法就是我用到的，放一个.go()方法在最后，作为终结方法。要实现Method Chaining，其实只需要顶一个类，对于需要做连接的方法，最后都返回这个类的实例。例如：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> view<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, assetid<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> assetid:     <span style="color: #008000;">self</span>.<span style="color: black;">asset_id</span> = assetid
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> anetwork<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, networkid<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> networkid:   <span style="color: #008000;">self</span>.<span style="color: black;">a_network_id</span> = networkid
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> snetwork<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, networkid<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> networkid:   <span style="color: #008000;">self</span>.<span style="color: black;">s_network_id</span> = networkid
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> dnetwork<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, networkid<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> networkid:   <span style="color: #008000;">self</span>.<span style="color: black;">d_network_id</span> = networkid
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> onsite<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sectionid<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> sectionid:   <span style="color: #008000;">self</span>.<span style="color: black;">site_section_id</span> = sectionid
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> times<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, times<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> times<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">0</span>:       <span style="color: #008000;">self</span>.<span style="color: black;">request_times</span> = times
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span></pre></div></div>

<p>最后一个终结方法go()，就做真正的处理</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> go<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">asset_id</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">site_section_id</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">times</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">a_network_id</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">s_network_id</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">prepareRequest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">request_times</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">sendRequest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">cleanup</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        info = <span style="color: #483d8b;">'Required information missing, abort running.'</span>
        <span style="color: #dc143c;">logging</span>.<span style="color: black;">debug</span><span style="color: black;">&#40;</span>info<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> info</pre></div></div>

<p>如果是实现一个External DSL 的话，的确难度不小；但是Internal DSL其实并不是很高深，也不是很难实现，在它的帮助下，可以把工作完成的更好，对自己以后维护测试用例也带来了不少方便。</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%2Fautomationtesting%2Fdsl-automation-testing-using-python%2F&amp;t=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL" 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%2Fautomationtesting%2Fdsl-automation-testing-using-python%2F&title=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL" 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%2Fautomationtesting%2Fdsl-automation-testing-using-python%2F&title=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL&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=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fautomationtesting%2Fdsl-automation-testing-using-python%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%2Fautomationtesting%2Fdsl-automation-testing-using-python%2F&amp;title=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL" 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=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fautomationtesting%2Fdsl-automation-testing-using-python%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=DSL%E4%B8%8E%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%20-%20%E7%94%A8Python%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84DSL%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fautomationtesting%2Fdsl-automation-testing-using-python%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/automationtesting/dsl-automation-testing-using-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用Python修改含有日期的文件名</title>
		<link>http://magustest.com/blog/linux/modify-filename-using-pytho/</link>
		<comments>http://magustest.com/blog/linux/modify-filename-using-pytho/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 10:15:35 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=587</guid>
		<description><![CDATA[问题：修要修改一些LOG FILE的名字，那些LOG FILE的文件名格式大概是 log-v0-20091012-daily-1a5019a0.csv 。需要修改红色的日期部分，把这个日期改小一点，例如改到20091001。 首先上程序： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import time, os, string, sys ONE_DAY = &#40;24 * 60 * 60&#41; if __name__ == &#34;__main__&#34;: if len&#40;sys.argv&#41;&#38;lt;2: print &#34;argv error, useage: python &#34; + __file__ + &#34; foldername int&#34; [...]


Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/warmup-asp-net-website/' rel='bookmark' title='Permanent Link: 用Python脚本对ASP.NET站点进行预热'>用Python脚本对ASP.NET站点进行预热</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>问题：修要修改一些LOG FILE的名字，那些LOG FILE的文件名格式大概是 log-v0-<span style="color: #ff0000;">20091012</span>-daily-1a5019a0.csv 。需要修改红色的日期部分，把这个日期改小一点，例如改到20091001。</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
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>, <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">string</span>, <span style="color: #dc143c;">sys</span>
ONE_DAY = <span style="color: black;">&#40;</span><span style="color: #ff4500;">24</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">60</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">60</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span><span style="color: #ff4500;">2</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;argv error, useage: python &quot;</span> + __file__ + <span style="color: #483d8b;">&quot; foldername int&quot;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span>==<span style="color: #ff4500;">2</span>:
        intrday = <span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        intrday = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    folder = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    localtime = <span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    todate = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>localtime<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>localtime<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: #008000;">str</span><span style="color: black;">&#40;</span>localtime<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    targettime = <span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - ONE_DAY<span style="color: #66cc66;">*</span>intrday<span style="color: black;">&#41;</span>
    newdate = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>targettime<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>targettime<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: #008000;">str</span><span style="color: black;">&#40;</span>targettime<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> folder
    <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">listdir</span><span style="color: black;">&#40;</span>folder<span style="color: black;">&#41;</span>:
        newname = <span style="color: #dc143c;">string</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span>, todate<span style="color: black;">&#41;</span>, newdate<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">os</span>.<span style="color: black;">rename</span><span style="color: black;">&#40;</span>folder+<span style="color: #008000;">file</span>, folder+newname<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>用的时候就是 $ python rename.py ./ 4 ；这个命令会把当前目录下面符合这个条件的文件名中的日期往前改4天，运行完了以后的文件名就是：log-v0-<span style="color: #ff0000;">20091008</span>-daily-1a5019a0.csv</p>
<p>如果还需要把文件的访问时间和修改时间也一并修改的话，那么只需要用os.utime(path, times)这个函数就好了，times是元组(Tuple)，一般可以这样用：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">time_for_utime = <span style="color: black;">&#40;</span><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: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">os</span>.<span style="color: black;">utime</span><span style="color: black;">&#40;</span>path, time_for_utime<span style="color: black;">&#41;</span></pre></td></tr></table></div>




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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&amp;annotation=%E9%97%AE%E9%A2%98%EF%BC%9A%E4%BF%AE%E8%A6%81%E4%BF%AE%E6%94%B9%E4%B8%80%E4%BA%9BLOG%20FILE%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E9%82%A3%E4%BA%9BLOG%20FILE%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%A0%BC%E5%BC%8F%E5%A4%A7%E6%A6%82%E6%98%AF%20log-v0-20091012-daily-1a5019a0.csv%20%E3%80%82%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E7%BA%A2%E8%89%B2%E7%9A%84%E6%97%A5%E6%9C%9F%E9%83%A8%E5%88%86%EF%BC%8C%E6%8A%8A%E8%BF%99%E4%B8%AA%E6%97%A5%E6%9C%9F%E6%94%B9%E5%B0%8F%E4%B8%80%E7%82%B9%EF%BC%8C%E4%BE%8B%E5%A6%82%E6%94%B9%E5%88%B020091001%E3%80%82%0D%0A%0D%0A%E9%A6%96%E5%85%88%E4%B8%8A%E7%A8%8B%E5%BA%8F%EF%BC%9A%0D%0Aimport%20tim" 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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&amp;bodytext=%E9%97%AE%E9%A2%98%EF%BC%9A%E4%BF%AE%E8%A6%81%E4%BF%AE%E6%94%B9%E4%B8%80%E4%BA%9BLOG%20FILE%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E9%82%A3%E4%BA%9BLOG%20FILE%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%A0%BC%E5%BC%8F%E5%A4%A7%E6%A6%82%E6%98%AF%20log-v0-20091012-daily-1a5019a0.csv%20%E3%80%82%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E7%BA%A2%E8%89%B2%E7%9A%84%E6%97%A5%E6%9C%9F%E9%83%A8%E5%88%86%EF%BC%8C%E6%8A%8A%E8%BF%99%E4%B8%AA%E6%97%A5%E6%9C%9F%E6%94%B9%E5%B0%8F%E4%B8%80%E7%82%B9%EF%BC%8C%E4%BE%8B%E5%A6%82%E6%94%B9%E5%88%B020091001%E3%80%82%0D%0A%0D%0A%E9%A6%96%E5%85%88%E4%B8%8A%E7%A8%8B%E5%BA%8F%EF%BC%9A%0D%0Aimport%20tim" 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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&amp;notes=%E9%97%AE%E9%A2%98%EF%BC%9A%E4%BF%AE%E8%A6%81%E4%BF%AE%E6%94%B9%E4%B8%80%E4%BA%9BLOG%20FILE%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E9%82%A3%E4%BA%9BLOG%20FILE%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%A0%BC%E5%BC%8F%E5%A4%A7%E6%A6%82%E6%98%AF%20log-v0-20091012-daily-1a5019a0.csv%20%E3%80%82%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E7%BA%A2%E8%89%B2%E7%9A%84%E6%97%A5%E6%9C%9F%E9%83%A8%E5%88%86%EF%BC%8C%E6%8A%8A%E8%BF%99%E4%B8%AA%E6%97%A5%E6%9C%9F%E6%94%B9%E5%B0%8F%E4%B8%80%E7%82%B9%EF%BC%8C%E4%BE%8B%E5%A6%82%E6%94%B9%E5%88%B020091001%E3%80%82%0D%0A%0D%0A%E9%A6%96%E5%85%88%E4%B8%8A%E7%A8%8B%E5%BA%8F%EF%BC%9A%0D%0Aimport%20tim" 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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;t=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%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%2Flinux%2Fmodify-filename-using-pytho%2F&title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%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%2Flinux%2Fmodify-filename-using-pytho%2F&title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%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=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Flinux%2Fmodify-filename-using-pytho%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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%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%2Flinux%2Fmodify-filename-using-pytho%2F&amp;title=%E7%94%A8Python%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&amp;body=%E9%97%AE%E9%A2%98%EF%BC%9A%E4%BF%AE%E8%A6%81%E4%BF%AE%E6%94%B9%E4%B8%80%E4%BA%9BLOG%20FILE%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E9%82%A3%E4%BA%9BLOG%20FILE%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E6%A0%BC%E5%BC%8F%E5%A4%A7%E6%A6%82%E6%98%AF%20log-v0-20091012-daily-1a5019a0.csv%20%E3%80%82%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E7%BA%A2%E8%89%B2%E7%9A%84%E6%97%A5%E6%9C%9F%E9%83%A8%E5%88%86%EF%BC%8C%E6%8A%8A%E8%BF%99%E4%B8%AA%E6%97%A5%E6%9C%9F%E6%94%B9%E5%B0%8F%E4%B8%80%E7%82%B9%EF%BC%8C%E4%BE%8B%E5%A6%82%E6%94%B9%E5%88%B020091001%E3%80%82%0D%0A%0D%0A%E9%A6%96%E5%85%88%E4%B8%8A%E7%A8%8B%E5%BA%8F%EF%BC%9A%0D%0Aimport%20tim" 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%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Flinux%2Fmodify-filename-using-pytho%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%E4%BF%AE%E6%94%B9%E5%90%AB%E6%9C%89%E6%97%A5%E6%9C%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Flinux%2Fmodify-filename-using-pytho%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/warmup-asp-net-website/' rel='bookmark' title='Permanent Link: 用Python脚本对ASP.NET站点进行预热'>用Python脚本对ASP.NET站点进行预热</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/linux/modify-filename-using-pytho/feed/</wfw:commentRss>
		<slash:comments>0</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>Python中写文本文件的方法</title>
		<link>http://magustest.com/blog/softwaretesting/how-to-write-a-file-by-using-python/</link>
		<comments>http://magustest.com/blog/softwaretesting/how-to-write-a-file-by-using-python/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 06:53:46 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[软件测试]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=134</guid>
		<description><![CDATA[最近在测试一个.NET下面的规则引擎，这个规则引擎用到了IronPython，PYTHON代码是写在配置文件里面的，.NET动态生成一些Python脚本，然后创建一个ScriptContext出来。测试这个动态生成的玩意儿很费劲！所以我就决定把python里面的变量都输出出去，这样就容易调试了。 一、打开文件 代码如下： &#62;&#62;&#62; f = open(&#8220;c:\my.txt&#8221;, &#8220;w&#8221;) 说明： open(filename[, mode[, bufsize]]) 第一个参数(&#8220;c:\my.txt&#8221;)是文件名称，包括路径；第二个参数是打开的模式mode &#8216;r&#8217;：只读（这个是默认值。如果文件不存在，则抛出错误） &#8216;w&#8217;：只写（如果文件不存在，则自动创建文件；如果原来存在此文件，会把原来的文件删除掉，然后再新建一个文件） &#8216;a&#8217;：附加到文件末尾 最后一个参数bufsize，是指定该文件的BUFFER大小 如果需要以二进制方式打开文件，需要在mode后面加上字符&#8221;b&#8221;，比如&#8221;rb&#8221;"wb&#8221;等 二、写入文件 f.write(string) 将一个字符串写入文件。 三、关闭文件释放资源 文件操作完毕，一定要记得关闭文件f.close()，可以释放资源供其他程序使用 补充： 如果程序比较大，需要运行的时间比较长，建议在写了一定数量的字符串以后用Flush()这个方法把缓存中的内容强制写到文本文件中。 Share and Enjoy: No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>最近在测试一个.NET下面的规则引擎，这个规则引擎用到了IronPython，PYTHON代码是写在配置文件里面的，.NET动态生成一些Python脚本，然后创建一个ScriptContext出来。测试这个动态生成的玩意儿很费劲！所以我就决定把python里面的变量都输出出去，这样就容易调试了。</p>
<p><strong>一、打开文件</strong><br />
代码如下：<br />
&gt;&gt;&gt; f = open(&#8220;c:\my.txt&#8221;, &#8220;w&#8221;)<br />
说明：<br />
open(filename[, mode[, bufsize]])<br />
<span id="more-134"></span><br />
第一个参数(&#8220;c:\my.txt&#8221;)是文件名称，包括路径；第二个参数是打开的模式mode<br />
&#8216;r&#8217;：只读（这个是默认值。如果文件不存在，则抛出错误）<br />
&#8216;w&#8217;：只写（如果文件不存在，则自动创建文件；如果原来存在此文件，会把原来的文件删除掉，然后再新建一个文件）<br />
&#8216;a&#8217;：附加到文件末尾<br />
最后一个参数bufsize，是指定该文件的BUFFER大小</p>
<p>如果需要以二进制方式打开文件，需要在mode后面加上字符&#8221;b&#8221;，比如&#8221;rb&#8221;"wb&#8221;等</p>
<p><strong>二、写入文件</strong><br />
f.write(string) 将一个字符串写入文件。</p>
<p><strong>三、关闭文件释放资源</strong><br />
文件操作完毕，一定要记得关闭文件f.close()，可以释放资源供其他程序使用</p>
<p>补充：</p>
<p>如果程序比较大，需要运行的时间比较长，建议在写了一定数量的字符串以后用Flush()这个方法把缓存中的内容强制写到文本文件中。</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%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%2F&amp;title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;annotation=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%AA.NET%E4%B8%8B%E9%9D%A2%E7%9A%84%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%EF%BC%8C%E8%BF%99%E4%B8%AA%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E7%94%A8%E5%88%B0%E4%BA%86IronPython%EF%BC%8CPYTHON%E4%BB%A3%E7%A0%81%E6%98%AF%E5%86%99%E5%9C%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%87%8C%E9%9D%A2%E7%9A%84%EF%BC%8C.NET%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E4%B8%80%E4%BA%9BPython%E8%84%9A%E6%9C%AC%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAScriptContext%E5%87%BA%E6%9D%A5%E3%80%82%E6%B5%8B%E8%AF%95%E8%BF%99%E4%B8%AA%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E7%9A%84%E7%8E%A9%E6%84%8F%E5%84%BF%E5%BE%88" 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%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%2F&amp;title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;bodytext=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%AA.NET%E4%B8%8B%E9%9D%A2%E7%9A%84%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%EF%BC%8C%E8%BF%99%E4%B8%AA%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E7%94%A8%E5%88%B0%E4%BA%86IronPython%EF%BC%8CPYTHON%E4%BB%A3%E7%A0%81%E6%98%AF%E5%86%99%E5%9C%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%87%8C%E9%9D%A2%E7%9A%84%EF%BC%8C.NET%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E4%B8%80%E4%BA%9BPython%E8%84%9A%E6%9C%AC%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAScriptContext%E5%87%BA%E6%9D%A5%E3%80%82%E6%B5%8B%E8%AF%95%E8%BF%99%E4%B8%AA%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E7%9A%84%E7%8E%A9%E6%84%8F%E5%84%BF%E5%BE%88" 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%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%2F&amp;title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;notes=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%AA.NET%E4%B8%8B%E9%9D%A2%E7%9A%84%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%EF%BC%8C%E8%BF%99%E4%B8%AA%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E7%94%A8%E5%88%B0%E4%BA%86IronPython%EF%BC%8CPYTHON%E4%BB%A3%E7%A0%81%E6%98%AF%E5%86%99%E5%9C%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%87%8C%E9%9D%A2%E7%9A%84%EF%BC%8C.NET%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E4%B8%80%E4%BA%9BPython%E8%84%9A%E6%9C%AC%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAScriptContext%E5%87%BA%E6%9D%A5%E3%80%82%E6%B5%8B%E8%AF%95%E8%BF%99%E4%B8%AA%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E7%9A%84%E7%8E%A9%E6%84%8F%E5%84%BF%E5%BE%88" 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%2Fhow-to-write-a-file-by-using-python%2F&amp;t=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95" 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%2Fhow-to-write-a-file-by-using-python%2F&title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95" 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%2Fhow-to-write-a-file-by-using-python%2F&title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&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=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%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%2Fhow-to-write-a-file-by-using-python%2F&amp;title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95" 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%2Fhow-to-write-a-file-by-using-python%2F&amp;title=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;body=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%AA.NET%E4%B8%8B%E9%9D%A2%E7%9A%84%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%EF%BC%8C%E8%BF%99%E4%B8%AA%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E%E7%94%A8%E5%88%B0%E4%BA%86IronPython%EF%BC%8CPYTHON%E4%BB%A3%E7%A0%81%E6%98%AF%E5%86%99%E5%9C%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%87%8C%E9%9D%A2%E7%9A%84%EF%BC%8C.NET%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E4%B8%80%E4%BA%9BPython%E8%84%9A%E6%9C%AC%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAScriptContext%E5%87%BA%E6%9D%A5%E3%80%82%E6%B5%8B%E8%AF%95%E8%BF%99%E4%B8%AA%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E7%9A%84%E7%8E%A9%E6%84%8F%E5%84%BF%E5%BE%88" 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=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%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=Python%E4%B8%AD%E5%86%99%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fsoftwaretesting%2Fhow-to-write-a-file-by-using-python%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/softwaretesting/how-to-write-a-file-by-using-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
