附自己的selenium博客,可结合unittest使用:Selenium常用API
一、Pycharm运行方式
- 以脚本的方式运行
在Pycharm中,平常默认就是以脚本的方式运行,除非使用了测试框架,否则都是以脚本的方式运行(Run xxx)
- 以unittest框架运行
当我们使用unittest框架的时候,就可以以unittest框架来运行相应的测试类或测试用例(Run Unittests in xxx)
- 以其他测试框架运行
默认情况下,Pycharm的配置是用unittest框架(Python自带),如果我们装了其他框架(如pytest),可以通过修改设置来使用测试框架运行。
修改配置的方法:
File → Settings → Tools → Python Integrated Tools → Testing下的Default test runner → 选择对应框架
二、unittest四大特性
- TestCase
unittest提供了TestCase这个类,所有的测试类都要继承这个类,并且每个方法(即测试用例)都要以test开头,unittest框架执行的时候就会去找这些以test开头的方法,然后执行。
那么,没有以test开头的方法,就是平时类里面的普通方法,不会当做测试用例,所以一般可以用来当做接口,供测试用例来调用。
需要说明的是,默认测试用例的执行顺序是按照ASCII码表的顺序执行的,并且unittest支持只执行单个测试用例(Pycharm中通过把光标放在方法(即测试用例)上右键Run)
unittest标记测试用例的运行结果的形式:
成功为.(点) ,失败为F,出错为E,跳过为s,预期失败为x,意想不到的成功为u
- TestFixture
通常我们在执行测试用例前和后,都要做一些初始化或者清理工作,unittest提供了TestFixture给我们使用,包括以下几个方法:
(1) setUp():每个测试用例执行前都会调用这个函数,一般用于初始化操作
(2) tearDown():每个测试用例执行后都会调用这个函数,一般用于清理操作
(3) setUpClass():所有测试用例执行前都会调用这个函数,一般用于初始化操作
(4) tearDownClass():所有测试用例执行后都会调用这个函数,一般用于清理操作
可以看出,setUp()
和tearDown()
的特点是有多少条测试用例,就会执行多少次。而setUpClass()
和tearDownClass()
在整个过程只会在执行一次。
另外,setUpClass()
和tearDownClass()
在使用的时候,要在相应的方法(测试用例)前加上@classmethod
装饰器。
整个执行顺序如下:
- TestSuite
unittest提供TestSuite(测试套件)给我们使用,让我们能够执行大量的测试用例,并且可以按照自己定义的顺序执行(而不是原来按照ASCII码表的顺序)。
为了方便,下面用suite = unittest.TestSuite(),module 表示 测试类所在的模块名,class 表示 具体测试类, method 表示 具体方法(即测试用例)
,主要有以下几种运用形式:
(1)suite.addTest(class("method"))
这个方法可以一个个的添加具体测试用例,并且按照添加的顺序来执行。
(2)suite.addTests([class("method"), class("method"), ...])
这个方法可以用来批量添加测试用例,和上面类似,只不过传递的是一个列表,
列表里的每一项就是具体的测试用例。
在介绍下面的方法前,先说明一个东西:defaultTestLoader = TestLoader()
下面就是证明:import unittest print(type(unittest.defaultTestLoader)) # <class 'unittest.loader.TestLoader'> print(isinstance(unittest.defaultTestLoader, unittest.TestLoader)) # True
说这个主要为了提醒大家,使用的时候,如果使用unittest.TestLoader要记得实例化
或者就直接用;defaultTestLoader,否则肯定会报错的。
注:下面的所有方法都是返回TestSuite对象,既可以直接使用,也可以先实例化一个
TestSuite对象,然后通过addTest()或addTests()的方式添加
(3) unittest.defaultTestLoader.discover(start_dir, pattern)
这个方法可以用来运行目录下的对应文件里所有的测试用例,其中start_dir表示为开始寻找的目录位置,pattern为匹配
模式,用正则表达式,比如"test*.py"表示运行所有以test开头的py文件里面的测试用例。
如果不用defaultTestLoader,就要写 unittest.TestLoader().discover()
。
(4) unittest.defaultTestLoader.loadTestsFromTestCase(module.class)
参数为测试类(继承了unittest.TestCase的)
(5) unittest.defaultTestLoader.loadTestsFromModule(module)
参数为测试用例所在的模块
(6) unittest.defaultTestLoader.loadTestsFromName("module.class.method")
参数为具体测试用例,需要注意的是:要加上引号
(7) unittest.defaultTestLoader.loadTestsFromNames(["module.class.method", ...])
同上,只不过传的是列表
- TestRunner
上面TestSuite只是把所有要用到的测试用例放在了一起,并没有实现用例的执行,所以TestRunner就是用来配合TestSuite使用的。
其中unittest自带的有 TextTestRunner ,通过调用其run(suite)
方法来运行相应的测试套件。这个自带的比较简单,我们可以自己去下载网上很多写好的 HTMLTestRunner 的py文件,用来生成Html形式的报告。这个扩展性比较高,可以自己去摸索,也有生成中文的,各种各样的,甚至可以自己按照自己想要的方式定制。
三、断言
断言是测试的精髓,没有断言就没有灵魂。写测试用例就是为了去检测能否达到预期的要求,如果不断言,根本就不知道这条测试用例到底算不算通过。
unittest提供了非常多的断言,种类丰富,但是常用的也就几个,比如assertEqual()、assertIn()等,另外它们都有一个msg参数,如果断言不通过,就可以在测试报告中看到这个信息。
四、跳过用例 & 预期失败
有的时候,我们可能暂时不需要执行某些测试用例(比如已经测试完注册的接口,后面只需要登录去做别的测试,我们就可以跳过注册这个测试用例),或者知道某些测试用例有可能会执行失败,我们就可以通过跳过用例和标记为预期失败来完成上述的操作。
unittest跳过用例和预期失败都是通过 装饰器 来完成的。
-
@unittest.skip(reason: str)
无条件跳过,说明要跳过测试的原因 -
@unittest.skipIf(condition: object, reason: str)
有条件跳过,当条件为真(True)时,才会跳过测试,并说明要跳过测试的原因 -
@unittest.skipUnless(condition: object, reason: str)
有条件跳过,当条件为假(False)时,才会跳过测试,并说明要跳过测试的原因 -
@unittest.expectedFailure
标记这个测试为预期失败,如果这个测试不通过,不会算作失败(即会标记为passed)
注意:只有这个装饰器不需要传参,不要加上括号,否则会报错