Python接口测试-unittest

一、unittest

unittest是python自带的单元测试框架,尽管其主要是为单元测试服务的,但我们也可以用它来做接口的自动化测试。

unittest框架为我们编写用例提供了如下的能力

  • 定义用例的能力。unittest框架有一套固有套路,可以让我们定义测试用例时更加简单和统一

  • 断言的能力。unittest框架提供了一系列的断言

  • 各种执行策略。通过test suit或者扩展的方式,我们可以自定义用例执行的策略

快速了解unittest http://www.testclass.net/interface/unittest

二、核心原理及如何写测试用例

1、定义一个继承unittest.TestCase的类。class xxx(unittest.TestCase)。注意:python文件名不能名为unittest.py。

2、 定义以test开头的测试方法,这个方法就是测试用例,你可以在一个类里定义n个测试用例。

3、setUp() 和 tearDown()

 可以重写TestCase的这两个方法,这两个方法在每个测试方法执行前以及执行后执行一次,setUp用来为测试准备环境,tearDown用来清理环境,已备之后的测试。

如果想要在所有case执行之前准备一次环境,并在所有case执行结束之后再清理环境,我们可以用 setUpClass() 与 tearDownClass()。注意:此时重写方法的上一行要加上@classmethod装饰器,如

@classmethod

def setUpClass(cls):

    print "This setUpClass() method only called once."

4、可以通过TestSuite 安排用例执行的顺序。

5、最简单的执行所有用例的方法是:

if __name__ == '__main__':

    unittest.main()

复杂的话,可以结合TestSuite、TestLoader和TextTestRunner。

6、使用HTMLTestLoader生成更高大上的HTML报告,默认里只有TextTestLoader生成txt文件。

以上具体见 https://blog.csdn.net/huilan_same/article/details/52944782

简单例子(参数化的登录用例) https://www.cnblogs.com/yoyoketang/p/6576668.html

三、使用discover批量执行多个脚本的测试用例

1、discover方法里面有三个参数:

-case_dir:这个是待执行用例的目录。

-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

2、discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。

使用示例如下:

discover = unittest.defaultTestLoader.discover(case_path,pattern="test*.py", top_level_dir=None),然后再runner = unittest.TextTestRunner()和runner.run(discover)。

具体见 https://www.cnblogs.com/yoyoketang/p/6675827.html

四、unittest常用的断言方法

1.assertEqual(self, first, second, msg=None)

--判断两个参数相等:first == second

2.assertNotEqual(self, first, second, msg=None)

--判断两个参数不相等:first != second

3.assertIn(self, member, container, msg=None)

--判断是字符串是否包含:member in container

4.assertNotIn(self, member, container, msg=None)

--判断是字符串是否不包含:member not in container

5.assertTrue(self, expr, msg=None)

--判断是否为真:expr is True

6.assertFalse(self, expr, msg=None)

--判断是否为假:expr is False

7.assertIsNone(self, obj, msg=None)

--判断是否为None:obj is None

8.assertIsNotNone(self, obj, msg=None)
--判断是否不为None:obj is not None

使用示例:

def test01(self):
        '''判断 a == b '''
        a = 1
        b = 1
        self.assertEqual(a, b)

注意:可以自定义异常,assertEqual(self, first, second, msg=None)里除了相比较的两个参数first和second,还有第三个参数msg=None,这个msg参数就是遇到异常后自定义输出信息。不输入第三个参数的话就采用默认的输出信息。

五、数据驱动测试DDT

使用ddt 模块

1.测试数据为多个字典的list类型

2.测试类前加修饰@ddt.ddt

3.case前加修饰@ddt.data()

4.运行后用例会自动加载成三个单独的用例

具体见 https://www.cnblogs.com/yoyoketang/p/6706490.html

六、截图

断言失败或者抛出异常时候可以截图记录失败的界面。

截图方法

1.get_screenshot_as_file(self, filename)

--这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。

filename参数是保存文件的路径。
Usage:
driver.get_screenshot_as_file('/Screenshots/foo.png')

2.get_screenshot_as_base64(self)

--这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。

比如,想把截图放到html测试报告里。
Usage:
driver.get_screenshot_as_base64()

3.get_screenshot_as_png(self)
--这个是获取屏幕截图,保存的是二进制数据,很少用到.
Usage:
driver.get_screenshot_as_png()

注意:给图片命名可以加时间戳,避免被下一个截图覆盖文件。

猜你喜欢

转载自blog.csdn.net/hellochristie/article/details/88735662