??xml version="1.0" encoding="utf-8" standalone="yes"?>aaa级精品久久久国产片,久久精品人人做人人爽97,久久久久波多野结衣高潮http://www.shnenglu.com/leetaolion/category/4356.htmlOnly those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily. zh-cnTue, 20 May 2008 00:53:00 GMTTue, 20 May 2008 00:53:00 GMT60温度计的寓言http://www.shnenglu.com/leetaolion/archive/2008/03/14/44525.html创徏更好的解x?/dc:creator>创徏更好的解x?/author>Fri, 14 Mar 2008 12:49:00 GMThttp://www.shnenglu.com/leetaolion/archive/2008/03/14/44525.htmlhttp://www.shnenglu.com/leetaolion/comments/44525.htmlhttp://www.shnenglu.com/leetaolion/archive/2008/03/14/44525.html#Feedback0http://www.shnenglu.com/leetaolion/comments/commentRss/44525.htmlhttp://www.shnenglu.com/leetaolion/services/trackbacks/44525.html一场突发的行性感冒,使得市面上体温计奇缺Qhg是水涨船高。一个农民企业家投资50w创徏的温度计公司Good MetorQ一直惨淡经营,q么好的ZQ自然不会放q。市Zh最高的是一U能记录一D|间内Z温度变化曲线Qƈ判断使用者是否患上这U可怕的感的智能体温计Smart Thermometer。其实现很简单,无非是在传统的体温计上加一块单片机Q体温计和单片机满大街都是,而单片机内程序的掌握在AnyMetor几家大型温度计厂商手中,从不外泄。于是Good Metor军_赌一把,找h开发这UYӞ希望借此咔Rn?br>一个偶然的ZQGoodMetor来到了YoungSoftQ双方一拍即合。由YongSoft承担Smart Thermometer软g的开发工作,价钱谈定100kRMBQ定?0kQ双方约?个月之内交货Q按期交货另有奖?0kRMB?br>q种工作对YongSoft直是手到擒来Q哥5个齐上阵Q不肖两个月的时_GoodSmartMetro v1.0版本Release了。剩下一个月的时_5位年Mh有够的旉喝喝Ӟ聊聊天,做些零碎的活Q等着GoodMetor来验收?br>在两个半月的时候,GoodMetor坐不住了,匆匆忙忙来到YoungSoftQ当得知软g已经正式发布的时候,自然喜不自禁Q当日即付清货款和奖金,回厂扚w生?br>可怕的感又持l了两个月,l于的到了有效的控制。GoodMetor公司的超低h只能体温计在q次抗击感中在为国家和C会作出卓越贡献的同Ӟ更ؓ公司赚了个盆满钵满,500w的纯利润啊,GoodMetor的老大做梦都没惛_q?br>CPI高企Q钱存银行不明智QGoodMetor老大军_Q扩大生产。生产啥呢?现在人都讲究健康饮食Q饮用水上更是严格把养IU学研究表明Q烧开水时如果水温上升曲线和推荐曲U吻合,人喝了之后会更健店于是一U监水温控制火候的新型灶具HealthOven应运而生。老大拍板Q就搞它了?br>于是又找CYoungSoft?br>半年q去了,YoungSoft的几个年Mh做了几个项目,人员l构也发生了改变Q大家有了更明确的分工。一个联pM务,分析需求,量~码的HuManagerQ三个编码的WenProgramersQ一个负责测试,量~码的WuTester?br>HuManager分析认ؓQHealthOven和SmartThermometer之间Q除量范围从h的体温上升到水的沸点之外Q温度计中的液体也从水银换成了酒_。GoodSmartMetro v1.0中采用了一个免费的液体体积温差换算库MercuryLibQ所以做的时候省M大把的工作。酒_֒水银的物理属性相差太大,q次换算的功能怕是要自己开发了Q暂定名为LiquidLibQ支持水银和酒精的体U温差换。但是以前直接调用MercuryLib的模块必进行解耦和试Q多C能要了?br>最l,双发U定5个月内Y件交付用,Mh50wRMBQ定?0wRMBQ及时交付奖?wRMB?br>在GoodSmartMetro v2.0开发进行到W?个月的时候,WenProgramer了解刎ͼ产业升q程中,温控炉GreenIron炼钢能大q降低能耗,q在一ơ项目组CCB会议上提了出来,大家一致认为YoungSoft要加速发展,必须着眼未来。GoodSmartMetro v2.0版本可以为将来打开GreenIron市场早做准备。不能再吃MercuryLib那样的亏了。LiquidLib模块需要良好的通用性,来可以作ؓq_的基模块Q支持各U不同液体做成温度计的温控Y件开发?br>GreenIron讑֤商采用不同的液体做成的温度计Q在q个问题上,业界q没有统一的标准?br>Q未完待l?..Q?br>

]]>
用CPPUnit做单元测试(原文在E文全MQ?/title><link>http://www.shnenglu.com/leetaolion/archive/2007/05/26/24882.html</link><dc:creator>创徏更好的解x?/dc:creator><author>创徏更好的解x?/author><pubDate>Sat, 26 May 2007 02:53:00 GMT</pubDate><guid>http://www.shnenglu.com/leetaolion/archive/2007/05/26/24882.html</guid><wfw:comment>http://www.shnenglu.com/leetaolion/comments/24882.html</wfw:comment><comments>http://www.shnenglu.com/leetaolion/archive/2007/05/26/24882.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/leetaolion/comments/commentRss/24882.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/leetaolion/services/trackbacks/24882.html</trackback:ping><description><![CDATA[<p>用CPPUnit做单元测?br>例子E序下蝲Q?a >http://www.codeproject.com/library/Using_CPPUnit/my_tests.zip</a><br>CPPUnit最新版本免费下载:<br><a >http://cppunit.sourceforge.net/</a><br>CPPUnit是基于C++的单元测试框Ӟ可以有效提高开发的pȝ质量?br>引言Q?br>QAq程帔R用两U测试方法:<br>1、单元测试(acceptance试Q:Y件系l中的每一个逻辑单元制定的一pd验证Ҏ。仅试单元的功能,而不考虑各个单元之间的协作关pR?br>2、系l测试(集成试Q:试pȝ的功能,其是各单元模块之间的协作关pR?br>下面要讲的是如何采用CPPUnit对C/C++工程q行单元试?br>文章假设读者熟悉单元测试的概念及其重要性?br>单元试设计Q?br>想一下开发团队中常常出现的一U场景:E序员正在用Debugger工具试代码。采用Debugger工具可以可以随时随地查每个变量。步步跟t,查变量的值是否异常。Debugger是一U强有力的调试工P但是调试速度相当慢,q且包含不少错误。在q种情况下调试是让h崩溃的。这些复杂有大量重复的验证方法是可以通过自动化的手段完成的,需要做的是选择合适的工具q编写少量代码?br>下面要介l的工具叫做“单元试框架”Q借助q种工具Q可以通过~写一些小的模块来完成模块Q可以是cR函数和库)的单元测试?br>下面来看一个例子:~写一个小的模块,主要功能是求两数之和。其C语言代码如下Q?br>BOOL addition(int a, int b)<br>{<br>    return (a + b);<br>}<br>试单元~写成另外一个模块(C函数Q。该模块试所有可能的求两C和的l合Q通过q回True或False来判断被模块是否通过了测试。代码如下:<br>BOOL additionTest()<br>{<br>    if ( addition(1, 2) != 3)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(0, 0) != 0)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(10, 0) != 10)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(-8, 0) != -8)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(5, -5) != 0)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(-5, 2) != -3)<br>    {<br>        return (FALSE);<br>    }</p> <p>    if ( addition(-4, -1) != -5)<br>    {<br>        return (FALSE);<br>    }</p> <p>    return (TRUE);<br>}<br>试的情况包括:<br>正数+正数<br>0+0<br>正数+0<br>负数+0<br>正数+负数<br>负数+正数<br>负数+负数<br>每一ơ测试都是通过Ҏ被测模块的返回值和期望|如果二者不同,q回FALSE。如果最l返回TRUEQ说明模块通过了所有的试?br>q个用以试其他模块的小模块Q函敎ͼ被称为Test Case, 其中包含了程序员需要对被测单元的一pd查。每一个确认(对被单元的一ơ调用)都必d被测单元相对应。在q个例子中,查了“求和操作”在操作数W号不同的情况下的运行情c当然了Q还需要另外写一些Test Case来验证其他情况下的运行情c比如其他一些常见的加法l合。例子如下:<br>int additionPropertiesTest()<br>{<br>    //conmutative: a + b = b + a<br>    if ( addition(1, 2) != addition(2, 1) )<br>    {<br> return (FALSE);<br>    }</p> <p>    //asociative: a + (b + c) = (a + b) + c<br>    if ( addition(1, addition(2, 3)) != addition(addition(2, 1), 3 ) )<br>    {<br> return (FALSE);<br>    }</p> <p>    //neutral element: a + NEUTRAL = a<br>    if ( addition(10, 0) != 10 )<br>    {<br> return (FALSE);<br>    }</p> <p>    //inverse element: a + INVERSE = NEUTRAL<br>    if ( addition(10, -10) != 0 )<br>    {<br> return (FALSE);<br>    }</p> <p>    return (TRUE);<br>}<br>上面的例子测试了多个数据相加序不同的情c?br>上述的两个Test Casel成了一个Test SuiteQTest Suite是指用来试同一被测单元的一lTest Case?br>在开发被模块时必须同时~写q些Test Case和Test Suite的代码,被测模块变更Ӟ要同时变_有时需要增加)相应的Test Case和Test Suite?br>举例来说Q当求和模块升为可以对数求和的模块,必d更Test Case和Test SuiteQ加入诸如addDecimalNumbersTest之类的Test Case?br>极限~程E序员在~写目标模块之前开发出所有单元测试中要用到的Test Case。其主要理由是:一旦程序员处于开发过E之中,那么他就q入了一个持l改q的阶段Q必d时考虑单元模块功能、需要公布的接口、需要给Ҏ传递的参数、外部访问、内部行为等{。在~写目标单元之前通过开发Test CaseQ可以对需要考虑的这些因素有更好的了解,q样~写目标模块与其他方法相比速度会更快,代码的质量也会更好?br>每当开发团队需要发布新版本的时候,都要q行d的单元测试。所有的单元必须通过单元试Q这样就可以发布成功的版本。如果有1个或以上的单元没有通过所有的试QBug出C。遇到这U情况就需要在q行试Q如果需要的话还需要增加新的Test CaseQ检查可以Bug再现的所有情c如果新的Test Case可以使Bug重现Q就可以修正q个BugQ然后再q行试Q如果模块通过了测试,可以认为Bug已经修正Q可以发布新的无Bug版本了?br>为每一个发现的Bugd新的Test Case是很有必要的Q因为Bug会反复出玎ͼ当其重复出现旉要有效的试来检Bug。这L话,Test Bettery会逐渐膨胀直至覆盖所有的历史Bug和潜在的错误?br>试工具Q?br>有两个小伙子Q一个叫Kent BeckQ另一个叫Eric GammaQ他们写了一pd的Javac,希望可以把测试做的尽可能自动化,q称之ؓJUnitQJUnit使整个单元测试界产生的很大的震动。其他的开发者们把JUnit的代码移植到其他语言上,构徏了一大系列称为xUnit框架的品。其d括C/C++的CUnit和CPPUnitQDelphi的DUnitQVisual Basic的VBUnitQ?NETq_上的NUnitQ等{?br>所有这些框枉采用同样的规则,对语a的依赖性很,熟悉其中一个框架就能够熟练应用其他框架?br>下面要讲的是如何通过使用CPPUnit来编写测试代码ƈ提高单元的质量?br>CPPUnit采用面向对象的编E方法,中间会遇到诸如封装、ѝ多态这些概c另外,CPPUnit采用C++ SEHQStructured Exception HandlingQ,所以还会遇到异常的概念Q以及throw, try, finally, catchq些指o?br>CPPUnit<br>每一个Test Case都需要在TestCasecȝzcM定义。TestCasecM包含了许多基本的功能Q比如运行测试、在Test Suite中注册Test Case{?br>比如在需要写一个在盘上存储数据的模块的时候,模块Q定义ؓDiskDatac)主要实现两个功能Q读取数据和装蝲数据。例E如下:<br>typedef struct _DATA<br>{<br>    int number;<br>    char string[256];<br>}DATA, *LPDATA;</p> <p>class DiskData<br>{<br>public:<br>    DiskData();<br>    ~DiskData();</p> <p>    LPDATA getData();<br>    void setData(LPDATA value);</p> <p>    bool load(char *filename);<br>    bool store(char *filename);</p> <p>private:<br>    DATA m_data;<br>};</p> <p>此时Q首先要做的事情不是弄明白上面的代码是如何变出来的,而是要确定上面所定义的类是否完成了设计的全部功能——正地d和存储数据?/p> <p>为此Q需要设计一个新的Test SuiteQ其中包含两个Test CaseQ一个读取数据、一个存储数据?/p> <p>使用CPPUnit</p> <p>最新版本的CPPUnit可以?a >http://cppunit.sourceforge.net/</a>上免费下载到Q其中包含所有的库文件、文档、例子程序和其他有趣的素材?/p> <p>在Win32环境下,可以在VC++Q?.0或更新版本)中用CPPUnitQ由于CPPUnit采用的是ANSI C++Q所以可应用于C++ Builder{开发环境中的版本较?br>构徏库文件的步骤可以在CPPUnit发布版本的INSTALL-WIN32.txt文g中找到。构<br>建好库文件之后就可以着手编写Test Suite了?/p> <p>在VC++下编写单元测试程序的步骤如下Q?br> 创徏一个基于MFC的对话框应用E序Q或者文档应用程序)<br> 开启RTTI:Project Settings -> C++ -> C++ Language<br> 在include目录中加入CPPUnit\include:Tools -> Options -> Directories -> Include<br> q接cppunitd.lib(静态连?或者cppunitd_dll.lib(动态连?Qtestrunnerd.lib。如果是?#8220;Release”配置下编译,同样需要连接这些库文gQ只是需要把名称中的“d”字母L?br> 拯testrunnerd.dll文g到可执行文g夹的下面Q或者\径下的其他文件夹中)Q如果是动态连接的话,q需要拷贝cppunitd_dll.dllQ?#8220;Release”配置下需要拷贝testrunner.dll和cppunit_dll.dllQ?/p> <p>配置好之后即可以着手进行单元测试类~码了?/p> <p>待测试的DiskDatac,主要实现两个功能Q读取和存储盘上的数据。要试q两个功能,需要两个Test CaseQ一个负责读取数据、一个负责存储数据?br>下面是单元测试类的定义:<br>#if !defined(DISKDATA_TESTCASE_H_INCLUDED)<br>#define DISKDATA_TESTCASE_H_INCLUDED</p> <p>#if _MSC_VER > 1000<br>#pragma once<br>#endif // _MSC_VER > 1000</p> <p>#include <cppunit/TestCase.h>//Z从基cTestCasez新的试c?br>#include <cppunit/extensions/HelperMacros.h>//方便快速定义测试类的宏</p> <p>#include "DiskData.h"</p> <p>class DiskDataTestCase : public CppUnit::TestCase<br>{<br>    CPPUNIT_TEST_SUITE(DiskDataTestCase);//定义Test Suite的v?br> CPPUNIT_TEST(loadTest);//定义Test Case<br> CPPUNIT_TEST(storeTest);<br>    CPPUNIT_TEST_SUITE_END();//定义Test Suite的终?/p> <p>public:<br>    void setUp();<br>    void tearDown();</p> <p>protected:<br>    void loadTest();<br>    void storeTest();</p> <p>private:<br>    DiskData *fixture;<br>};</p> <p>#endif</p> <p>例程中,DiskDataTestCasec重载了两个ҎQsetUp()和tearDown()。这两个Ҏ在Test Case开始和l束的时候自动运行?/p> <p>试逻辑是在两个ProtectedҎ中实现的Q稍后要涉及到如何ؓ试逻辑~码?nbsp;</p> <p>例程的最后定义了指向DiskDatacd数据的指针fixtureQ用以保存测试过E中的目标对象。setUp()是初始化函数Q在调用每一个Test Case之前调用setUp()Q同时负责初始化目标对象。Test Caseq行q程中要使用fixture。在每一个Test Caseq行l束之后Q调用tearDown()销毁fixture。这P每次q行Test Case时所使用的都是新产生的fixture?/p> <p>试步骤如下Q?br> 开启测试程?br> 点击“Run”按键<br> 调用setUp()ҎQ初始化fixture<br> 调用W一个Test Case函数<br> 调用tearDown()ҎQ释放fixture<br> 调用setUp()ҎQ初始化fixture<br> 调用W二个Test Case函数<br> 调用tearDown()ҎQ释放fixture <br> ...</p> <p>l过~码Q?br>#include "DiskDataTestCase.h"</p> <p>CPPUNIT_TEST_SUITE_REGISTRATION(DiskDataTestCase);</p> <p><br>void DiskDataTestCase::setUp()<br>{<br>    fixture = new DiskData();<br>}</p> <p>void DiskDataTestCase::tearDown()<br>{<br>    delete fixture;<br>    fixture = NULL;<br>}</p> <p><br>void DiskDataTestCase::loadTest()<br>{<br>    // our load test logic<br>}</p> <p><br>void DiskDataTestCase::storeTest()<br>{<br>    // our store test logic<br>}</p> <p>现在Q编码已l变得非常简单了QsetUp()和tearDown()实现了创建、释放fixtureQ下面要做的是为loadTest()、storeTest()~码了?/p> <p>Test Case~码</p> <p>搞清楚需要测试那些方面之后的工作是编码实现。可以通过使用库函数、第三方库函数、Win32 API或者C/C++操作W和指o的内部属性?/p> <p>有时需要辅助的文g或者数据库表来存储正确的数据。在本例中,通过Ҏ内部不数据和外部文g的数据来判断l果是否正确?/p> <p>当出现错误时Q比如内部数据和外部数据不同Q,需要抛出异常。可以通过CPPUNIT_FAIL(message)宏实玎ͼ也可以通过assertions宏实现?br>以下是一些常用的assertion?<br> CPPUNIT_ASSERT(condition): 查conditionQ如为falseQ抛出异?br> CPPUNIT_ASSERT_MESSAGE(message, condition): 查conditionQ如为falseQ抛出异常,q显C预先设定的信息<br> CPPUNIT_ASSERT_EQUAL(expected,current): 查expected与current的值是否相{,抛出异常Q显Cexpected和current的?br> CPPUNIT_ASSERT_EQUAL_MESSAGE(message,expected,current): 查expected的gactual的值是否相{,抛出异常Q显Cexpected,current的|q显C预先设定的信息<br> CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,current,delta): 查expected, current之差是否于deltaQ如果不于Q显Cexpected和current的?/p> <p>下面讲一下loadTest~码的编码构惻I首先需要一个外部文Ӟ其中存储q一个DATA型数据,文g的创建方式ƈ不重要,关键是要保证里面的数据的正确性。然后,要进行的操作是检查load函数从外部文件中d的数据和实现存在其中的数据是否一致。代码如下:<br>//<br>// 前提Q外部文件中已存储了正确的数据?br>//<br>#define AUX_FILENAME    "ok_data.dat"<br>#define FILE_NUMBER    19<br>#define FILE_STRING    "this is correct text stored in auxiliar file"</p> <p>void DiskDataTestCase::loadTest()<br>{<br>    // 相对路径转化为绝对\?br>    TCHAR    absoluteFilename[MAX_PATH];<br>    DWORD    size = MAX_PATH;</p> <p>    strcpy(absoluteFilename, AUX_FILENAME);<br>    CPPUNIT_ASSERT( RelativeToAbsolutePath(absoluteFilename, &size) );</p> <p>    // 执行操作<br>    CPPUNIT_ASSERT( fixture->load(absoluteFilename) );</p> <p>    // 通过assertion查运行结?br>    LPDATA    loadedData = fixture->getData();</p> <p>    CPPUNIT_ASSERT(loadedData != NULL);<br>    CPPUNIT_ASSERT_EQUAL(FILE_NUMBER, loadedData->number);<br>    CPPUNIT_ASSERT( 0 == strcmp(FILE_STRING, <br>            fixture->getData()->string) );<br>}</p> <p>通过q样一个简单的Test Case试?个可能存在的错误Q?br> load函数q回?br> getData函数q回?br> numberl构的成员?br> stringl构的成员?br> <br>storeTest要复杂一些,因ؓ需要把fixture中的数据存储C时文件中Q之后打开两个文gQ新的时文件和外部文gQ,d数据q比照内宏V代码如下:</p> <p>void DiskDataTestCase::storeTest()<br>{<br>    DATA    d;<br>    DWORD   tmpSize, auxSize;<br>    BYTE    *tmpBuff, *auxBuff;<br>    TCHAR   absoluteFilename[MAX_PATH];<br>    DWORD   size = MAX_PATH;</p> <p>    // 填充l构?br>    d.number = FILE_NUMBER;<br>    strcpy(d.string, FILE_STRING);</p> <p>    // 相对路径转化为绝对\?/p> <p>    strcpy(absoluteFilename, AUX_FILENAME);<br>    CPPUNIT_ASSERT( RelativeToAbsolutePath(absoluteFilename, &size) );</p> <p>    // 执行操作<br>    fixture->setData(&d);<br>    CPPUNIT_ASSERT( fixture->store("data.tmp") );</p> <p>    // d两文件的内容q对?br>    // ReadAllFileInMemory 是一个分配缓冲区的外部函?br>    // 把文件内容存入其? 调用函数负责释放~冲?<br>    tmpSize = ReadAllFileInMemory("data.tmp", tmpBuff);<br>    auxSize = ReadAllFileInMemory(absoluteFilename, auxBuff);</p> <p>    // 文g不存在则抛出异常<br>    CPPUNIT_ASSERT_MESSAGE("New file doesn't exists?", tmpSize > 0);<br>    CPPUNIT_ASSERT_MESSAGE("Aux file doesn't exists?", auxSize > 0);</p> <p>    // 文g大小可获得,否则抛出异常<br>    CPPUNIT_ASSERT(tmpSize != 0xFFFFFFFF);<br>    CPPUNIT_ASSERT(auxSize != 0xFFFFFFFF);</p> <p>    // ~冲区必d用,否则抛出异常<br>    CPPUNIT_ASSERT(tmpBuff != NULL);<br>    CPPUNIT_ASSERT(auxBuff != NULL);</p> <p>    // 两个文g的大必dDATA一?br>    CPPUNIT_ASSERT_EQUAL((DWORD) sizeof(DATA), tmpSize);<br>    CPPUNIT_ASSERT_EQUAL(auxSize, tmpSize);</p> <p>    // 两文件的内容必须一?br>    CPPUNIT_ASSERT( 0 == memcmp(tmpBuff, auxBuff, sizeof(DATA)) );</p> <p>    delete [] tmpBuff;<br>    delete [] auxBuff;</p> <p>    ::DeleteFile("data.tmp");<br>}</p> <p>启动用户界面<br>最后,看看如何昄ZMFC的用L面对话框Q事先在其内部编译了TestRunner.dllQ?/p> <p>打开实现cȝ文gQProjectNameApp.cppQ,把下列代码复制到InitInstanceҎ中:<br>#include <cppunit/ui/mfc/TestRunner.h><br>#include <cppunit/extensions/TestFactoryRegistry.h></p> <p>BOOL CMy_TestsApp::InitInstance()<br>{<br>    ....</p> <p>    // 声明Test RunnerQ用以注册的试填入其中Qƈq行<br>    CppUnit::MfcUi::TestRunner runner;</p> <p>    runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );</p> <p>    runner.run();    </p> <p>    return TRUE;<br>}<br> <br>很简单,不是吗?只需要定义一?runner"实例Q添加注册过的testQtest是通过CPP文g中的CPPUNIT_TEST_SUITE_REGISTRATION宏注册的Q,可以运行run函数了?/p> <p>~译、运行,开始你的单元测试吧:)</p> <img src ="http://www.shnenglu.com/leetaolion/aggbug/24882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/leetaolion/" target="_blank">创徏更好的解x?/a> 2007-05-26 10:53 <a href="http://www.shnenglu.com/leetaolion/archive/2007/05/26/24882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.r12319.cn" target="_blank">ŷձþùʵҶ԰</a>| <a href="http://www.bjnyjdxcj.cn" target="_blank">ɫۺϾþþþ</a>| <a href="http://www.mdjzyz.cn" target="_blank">þþƷ鶹</a>| <a href="http://www.haolinhaoju.cn" target="_blank">69Ʒþþþ777</a>| <a href="http://www.b3382.cn" target="_blank">˾þþƷӰԺ</a>| <a href="http://www.girlsp.cn" target="_blank">þۺ͵͵ɫ</a>| <a href="http://www.guwz.cn" target="_blank">97þþƷһ</a>| <a href="http://www.superpic.cn" target="_blank">þþþƷþþþþ</a>| <a href="http://www.90key.cn" target="_blank">ŷִִþþ</a>| <a href="http://www.g33e.cn" target="_blank">þþþ</a>| <a href="http://www.dyzwar.cn" target="_blank">Ʒһþ㽶߿ۿ </a>| <a href="http://www.shangxin.net.cn" target="_blank">Ʒþþþþø</a>| <a href="http://www.misuca.cn" target="_blank">ɫۺϾþ88ɫۺ</a>| <a href="http://www.xkart.cn" target="_blank">þۺϹapp</a>| <a href="http://www.force-equipment.com.cn" target="_blank">þþƷAV鶹</a>| <a href="http://www.mir802.cn" target="_blank">ŷƷþø</a>| <a href="http://www.lsdkgoio8843.cn" target="_blank">ŷһþ</a>| <a href="http://www.gyvgllqc.cn" target="_blank">ɫþþþþþС˵</a>| <a href="http://www.songli.org.cn" target="_blank">þ91ᆱƷ2020</a>| <a href="http://www.huochaipro.com.cn" target="_blank">ƷŮͬþþþõӰԺ</a>| <a href="http://www.bltt.net.cn" target="_blank">97þþþ</a>| <a href="http://www.668j.cn" target="_blank">91Ʒ91þþþþ</a>| <a href="http://www.bamboomart.cn" target="_blank">vĻþ</a>| <a href="http://www.gjvthsj.cn" target="_blank">þƵ6</a>| <a href="http://www.xspree.cn" target="_blank">þþþþþþþþѾƷ</a>| <a href="http://www.badnao.cn" target="_blank">˾þô߽Ʒ</a>| <a href="http://www.ggfuns.cn" target="_blank">þ99ȹоƷ</a>| <a href="http://www.k1877.cn" target="_blank">þԭƷ</a>| <a href="http://www.zkduo.cn" target="_blank">ξþ99ƷþþþþС˵</a>| <a href="http://www.kxw1.cn" target="_blank">91鶹Ʒ91þþ</a>| <a href="http://www.ysbzxx.com.cn" target="_blank">ɫۺϾþþþۺ99</a>| <a href="http://www.puruimu.cn" target="_blank">þþƷѲ</a>| <a href="http://www.jiyiabc.cn" target="_blank">Ѹþ</a>| <a href="http://www.sunwebs.cn" target="_blank">AVӰƬþþþþ</a>| <a href="http://www.mir802.cn" target="_blank">ŷþһ</a>| <a href="http://www.gangzheng.net.cn" target="_blank">þþƷ</a>| <a href="http://www.wdxxz.cn" target="_blank">þþƷݲݲ</a>| <a href="http://www.shanwengqing.com.cn" target="_blank">þԭƷӰԺ</a>| <a href="http://www.30ww.cn" target="_blank">ھƷþþþӰԺվ</a>| <a href="http://www.glhv.cn" target="_blank">þþþһëþþ</a>| <a href="http://www.jiawengc.cn" target="_blank">һþۺ³³ŷһ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>