自动化测试框架的设计思路

karamay 8年前
   <p><strong>在开始设计之前,我们首先需要考虑以下几个方面:</strong></p>    <p>使用该框架写出来的自动化测试案例,需要给开发,手动测试,可能还有客户查看,所以写的测试案例需要尽量的清晰明了,不要有太多复杂逻辑,及比较好的可读性。</p>    <p>使用这个框架做自动化的人,不会有太深的编程能力,所以要提供足够好的,最好是傻瓜化的测试点验证方法,及很好的异常容错处理能力。</p>    <p>测试框架最好是app,网页测试,接口测试,统统都能支持。</p>    <p>针对上面的几点,我们总结出以了下两个核心点:该测试框架需要很好的可读性和可扩展性。</p>    <p>思考如下。</p>    <h2><strong>可读性思考</strong></h2>    <p>对于测试案例,比较流行的两种观点:</p>    <p><strong>1. 希望做成自然语言描述的case</strong></p>    <p>比如:</p>    <p>I go to  “www.baidu.com”</p>    <p>I Input  “点融网”</p>    <p>I click 搜索按钮</p>    <p>I see  “点融网最有保障的P2P,最专业的技术团队”</p>    <p><strong>此方式为不懂技术的相关人员所喜爱,简单明了,可读性好。</strong></p>    <p><strong>2. 希望做成编程模式</strong></p>    <p>比如:</p>    <p>Driver.navigate_to(“www.baidu.com”)</p>    <p>element = driver.find_element_by_id(“id”,”kw”)</p>    <p>element.send_keys(“点融网”)</p>    <p>element = driver.find_element(“id”, ”su”)</p>    <p>element.click()</p>    <p>……</p>    <p>此方式是自动化测试工程师喜欢的方式。希望告诉大家,我们也是写代码的,记住我们也是coder。</p>    <p>针对以上两个不同观念,我们是否可以考虑将测试案例设计成,既能一定程度体现自然语言描述特点,又能兼顾使用程序语言的灵活性?</p>    <p>我们仔细分析测试场景,抽出UI测试的核心行为,无非就是:</p>    <p><strong>检查点:</strong></p>    <p>页面元素是否存在</p>    <p>页面元素显示内容是否正确</p>    <p>页面元素是否可用</p>    <p>……</p>    <p><strong>辅助功能:</strong></p>    <p>等待元素出现</p>    <p>点击某页面元素</p>    <p>给元素输入内容</p>    <p>……</p>    <p>分析抽出来的核心行为,发现这些行为基本都是针对一个个页面元素进行的操作。那么我们就可以做如下的动作:</p>    <p>将页面元素看成一个对象,封装成一个类</p>    <p>将上面分析得到的核心行为都封装成基类方法。然后确保,任何一个页面元素都继承该基类。</p>    <p>该基类提供类似于自然语言的方法名字,调用这些方法,就能很明确的知道测试案例在做什么检查,在做什么行为,这样就能极大的提高测试案例的可读性</p>    <p><strong>基类举例:</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/df94704a58615dd0810503b7d1f0fd84.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/9806c6bd2bb9502aed26e0e083516775.jpg"></p>    <p>该基类主要目的是在UI测试中,对元素共性的检查点和辅助方法进行抽取,将它们封装成一个个非常容易读懂的方法,且具有异常处理能力。</p>    <p>经过上述思路的整理,针对文章开始时例举的测试案例,就可以改写成如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/b5c740f59e11f1d814be3eab1f7f4e22.jpg"></p>    <p>该测试案例是不是可读性变强了呢?也直接用程序语言写出来了呢?在实际的使用过程中,可以让手动QA或者不太熟悉代码的QA专门负责测试案例的实现,底层的方法包装可以由经验丰富一些的同事做。</p>    <h2>扩展性思考</h2>    <p>基于UI测试,我们希望除了支持web测试,还能支持app的测试,可能还需要接口测试,等等。怎么做呢?</p>    <p>我们就需要考虑分层问题,将测试框架分为三层。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/4af184f358bdc15a5c1715f8bf438afb.jpg"></p>    <p><strong>第一层:测试案例层</strong></p>    <p>该层是测试案例的具体实现,就像上面写的case那样,用接近自然语言的方式,来实现测试案例。</p>    <p><strong>第二层:支持层</strong></p>    <p>该层主要提供workflow,通用工具,元素库的支持,便于测试案例层直接调用。</p>    <p><strong>Workflow:</strong> 主要封装测试项目中需要经常使用的针对项目的公用方法,供测试案例层直接调用。比如用户登录,注册一个用户,搜索出用户等等经常使用的动作。</p>    <p><strong>通用工具:</strong> 提供一些通用方法,比如生成一个随机电话号码,生成一个随机身份证,数据库操作,http操作支持等等</p>    <p><strong>元素库:</strong> 每一个页面元素的定位表达式(xpath,id,name,css,link_text等等表达式)</p>    <p>我们的测试案例,都是针对一个个元素进行操作的。将每一个页面的每一个元素,都看成一个继承了基类的特定类。所以,我们的第一步,就需要找到这个元素,定位到这个元素。测试项目的所有元素都放到这里。</p>    <p><strong>第三层: driver层</strong></p>    <p>这一层主要封装各种driver。比如我们针对网页测试,使用selenium-webdriver开发包,针对app测试,我们使用appium开发包。我们在这一层进行封装,通过调用selenium-webdriver,appium提供的原生方法,封装成可读性很强的方法且加上容错机制。以后就算我们要换用其他的第三方包,我们的测试案例层和支持层的方法也不需要做任何的修改。只需要修改driver层实现的方式就可以了。在一层,我们主要实现两个方面的封装,一个是driver的封装,一个是基于基类自然语言函数的封装。</p>    <p><strong>driver封装</strong></p>    <p>我们需要封装,根据参数确实是基于web测试还是基于app测试。比如:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/bf5da6db34969259407b361d9e9d6198.jpg"></p>    <p>该方法实现了对网页和app驱动的封装,根据不同参数,返回不同的driver。</p>    <p><strong>基类封装</strong></p>    <p>主要是封装各种可读性很很强的方法以及将元素定位标识及driver也封装进去。为了支持网页测试和app测试,我们需要两个基类,一个是针对网页操作基类,一个是针对app操作基类。同时为了web和app操作的一致性,我们要求对外提供的方法,必须要将常用的方法保持一致的名字和一样的参数类型及参数个数。</p>    <p>网页基类示例如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/6a6972b605029ddacf800483df2d9c66.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/280607e276d5e8f561b28b030e252c23.jpg"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/376b0b139ba01155ab158c49536f653e.jpg"></p>    <p>通过对driver和基类的封装,driver层实现了对网页测试和app测试的支持,并且针对两种测试,都提供了统一的方法,能够方便使用者,使用相同的方法,测试app和web。</p>    <p>通过对可读性和扩展性的思考,我们在开发测试框架的时候,如果考虑的比较周全,就能很好的提高测试案例的可读性和扩展性。</p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/242c8e069dc6</p>    <p> </p>