unittst与webdriver的关系(二)

在初始python单元测试框架unittest与webdriver的关系(一)中,介绍了unittest与自动化的结合,下面介绍测试套件TestSuite()

构建测试套件

一、addTest()

当有多个或者几百测试用例的时候,我们必须需要一个集合,来把测试用例放在该集合中,来进行执行,幸运的是,unittest模块中提供了TestSuite类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把单元测试用例加入到测试套件中,测试代码使用TestSuite的addTest进行更改,具体见如下的测试脚本:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

if __name__=='__main__':

suite=unittest.TestSuite()

suite.addTest(BaiduTest('testTitle'))

suite.addTest(BaiduTest('testUrl'))

unittest.TextTestRunner(verbosity=2).run(suite)

字体加粗的部分就是构建测试容器(测试套件)后,把测试用例添加到测试容器,来进行执行,这样的一个好处就是测试用例是按顺序的来执行。我们可以把suite写成一个静态方法来进行调用,那么如上实现的测试脚本就为:

#coding:utf-8

from seleniumimport webdriver

importunittest,sys,time

classBaiduTest(unittest.TestCase):

def setUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

def testTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

def testUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

def tearDown(self):

self.driver.quit()

@staticmethod

def suite():

suite=unittest.TestSuite()

suite.addTest(BaiduTest('testTitle'))

suite.addTest(BaiduTest('testUrl'))

return suite

if __name__=='__main__':

unittest.TextTestRunner(verbosity=2).run(BaiduTest.suite())

二、makeSuite()

利用addTest()可以实现测试用例的顺序执行,但是在自动化的测试中,每个case在一个测试容器中,应该是随机执行的,更加容易让人接受,这样也就每个case之间不会有互相依赖和牵制,另外一方面,在一个测试容器中,测试的case的数量最小在十以内,最多可能在几百或者几千,如果采用addTest的方法,那么对每个case都要进行添加,从而导致很多垃圾代码,如suite.addTest(BaiduTest('case'))

...

很显然,这样的代码,并不是我们想要的最好的结果,后期维护测试代码,也会带来无谓的时间浪费和增加人力的成本,自动化的优点就是符合在敏捷的规格中,来达到测试的结果,从而达到保障质量。可性的是,unittest提供了makeSuite的方法,makeSuite可以实现测试用例类内所有的测试用例组成的测试容器TestSuite,我们可以把如上的代码使用makeSuite来调整下,调整后的代码见如下:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

if __name__=='__main__':

suite=unittest.TestSuite(unittest.makeSuite(BaiduTest))

unittest.TextTestRunner(verbosity=2).run(suite)

这样,我们就不需要考虑测试容器中有多少case,也就没有了利用addTest产生的烦恼。我们把suite写成一个静态方法,来重构代码:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

@staticmethod

def suite():

suite=unittest.TestSuite(unittest.makeSuite(BaiduTest))

return suite

if __name__=='__main__':

unittest.TextTestRunner(verbosity=2).run(BaiduTest.suite())

三、TestLoader()

TestLoader用于创建类和模块的测试套件,一般的情况下,使用TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。见如下使用TestLoader调整的测试脚本:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

if __name__=='__main__':

suite=unittest.TestLoader().loadTestsFromTestCase(BaiduTest)

unittest.TextTestRunner(verbosity=2).run(suite)

我们把suite进行封装下,那么调整后的测试代码为:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

@staticmethod

def suite():

suite=unittest.TestLoader().loadTestsFromTestCase(BaiduTest)

return suite

if __name__=='__main__':

unittest.TextTestRunner(verbosity=2).run(BaiduTest.suite())

四、discover()

discover是通过递归的方式到其子目录中从指定的目录起始,找到所有测试模块并返回一个包含他们对象的TestSuite,然后进行加载与模式匹配唯一的测试文件。如下的实例就是在'D:/git/PyCharm/TestCase的目录下,存在test_share.py和test_share2模块的测试文件,我们利用正则表达式,程序会在'D:/git/PyCharm/TestCase的目录下,寻找到test_*.py的文件,然后进行加载并执行测试对象,见如下的测试代码:

#coding:utf-8

from selenium import webdriver

import unittest,sys,time

class BaiduTest(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Firefox()

self.driver.maximize_window()

self.driver.get('http://www.baidu.com')

self.driver.implicitly_wait(30)

deftestTitle(self):

self.assertEqual(u'百度一下,你就知道',self.driver.title)

deftestUrl(self):

self.assertEqual('https://www.baidu.com/',self.driver.current_url)

deftearDown(self):

self.driver.quit()

@staticmethod

def suite():

suite=unittest.defaultTestLoader.discover(

'D:/git/PyCharm/TestCase',

pattern='test_*.py',

top_level_dir=None

)

return suite

if __name__=='__main__':

unittest.TextTestRunner(verbosity=2).run(BaiduTest.suite())

见执行后的测试结果:

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2015-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

移动商城第六篇【单品查询、静态化页面】

单品页查询 当点击某个商品的时候,查看该商品的详细信息: ? 修改每个商品的超链接: <a href="${path}/ite...

46770
来自专栏令仔很忙

SpringIOC--初始化源码解析

在上一篇 Spring从入门到精通(一)—-IoC(控制反转) 中,详细的介绍了IOC的基本原理,本篇博客就不再赘述;这次主要是从源码的角度来给大家分享Spr...

10110
来自专栏Kubernetes

Kubernetes 1.8抢占式调

Author: xidianwangtao@gmail.com 阅读本博文前,建议先阅读解析Kubernetes 1.8中的基于Pod优先级的抢占式调度...

577140
来自专栏马洪彪

Java生成条码二维码

一、概述 可用barcode4j或zxing等第三方库,推荐zxing。 barcode4j资料链接:http://barcode4j.sourceforge....

52480
来自专栏不会写文章的程序员不是好厨师

使用BeanFactoryPostProcessor——这种姿势不要用

在公司内,Spring基本都是首选的IOC框架,Spring也提供了很多扩展点让我们介入到容器的生命周期中,例如BeanFactoryPostProcessor...

49430
来自专栏积累沉淀

windows下hadoop-eclipse的编程所引起的一系列错误

解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/S...

22850
来自专栏Kubernetes

从源码解析kube-scheduler默认的配置

本文作为Kubernetes Scheduler源码分析的番外篇,补充一个方面的分析:从源码层面解析kube-scheduler的默认配置是怎么做的。 从头来看...

34860
来自专栏c#开发者

C#开发终端式短信的原理和方法

简介   没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也...

47590
来自专栏海说

Spring IOC容器分析(4) -- bean创建获取完整流程

上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程。 测试环境创建 测试示例代码如下: pac...

35000
来自专栏草根专栏

使用xUnit为.net core程序进行单元测试(下2)

第1部分: https://cloud.tencent.com/developer/article/1019835

29770

扫码关注云+社区

领取腾讯云代金券