暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

单元测试框架unittest

原创 check 2022-06-21
915

 unittest 是python 语言的单元测试框架,提供了创建测试用例、测试套件和批量执行测试用例的方案。

  利用单元测试框架,可以创建一个类,该类继承 unttest 的 TestCase ,这样可以把每个 TestCase 看成是一个最小的单位,由测试套件组织起来,运行时直接执行即可,同时可以引入测试报告。

一、测试固件

  测试固件用于处理初始化操作,可以使测试固件只执行一次。

1、测试固件每次均执行

  unittest 单元测试框架中,提供了setUp 和 tesrDown 的测试固件。

+ View Code

  执行顺序是先执行 setUp 方法,再执行 test_baidu_so 或者 test_baidu_hi 其中一个,最后执行 tearDown 方法。有N个用例,setUp 方法、tearDown 方法 都会执行N次。

2、测试固件只执行一次

  使用 setUpClass 和 tearDownClass 方法。

+ View Code

  有N个用例,setUpClass 和 tearDownClass 方法 只会执行1次。

  但有一个问题,如:以百度首页测试点击新闻页面和测试点击地图页面为例,意味着点击新闻页面后,需要回到百度首页后才可以找得到地图页面的链接进行点击。

  所以,在实际的工作中,尽量使用测试固件 setUp 和 tearDown ,使得自动化测试用例之间没有关联性,避免一个测试用例执行失败是由于上一个测试用例导致的。

二、测试执行

  测试用例的执行是在主函数中,unittest 调用的是 main,代码如下:

1

main = TestProgram

  TestProgram 还是一个类,该类的构造函数如下代码:

+ View Code

  在 unittest 模块中包含的 main 方法,可以方便地将测试模块变为可以运行的测试脚本。main 使用 unittest.TestLoader 类来自动查找和加载模块内的测试用例,TestProgram 类中该部分的代码如下:

+ View Code

  在执行测试用例时,在 mian 方法中加入了 verbosity=2,代码如下:

1

unittest.main(verbosity=2)

  verbosity 中默认是 1 ,0 代表执行的测试总数和全局结果,2 代表显示详细的信息。

  verbosity=2 时,成功的测试用例会显示 OK,失败的测试用例会显示出详细的信息。

  如果想单独地执行某一测试,用鼠标右键点击要执行的测试用例名称,选择“Run”。

三、构建测试套件

  一个测试类中会有很多个测试用例,unittest 提供了“测试套件”方法,它由 unittest 模块中的 TestSuite 类表示,测试套件可以根据所测试的特性把测试用例组合在一起。

1、按顺序执行

  TestSuite 类中提供了 addTest 方法可以实现测试用例按顺序执行,要执行的测试用例按自己期望执行顺序添加到测试套件中。

+ View Code

  使用addTest方法按顺序执行,注解:首先对 TestSuite 类进行实例化,使之成为一个对象 suite ,然后调用 TestSuite 类中的 addTest 方法,把测试用例添加到测试套件中,最后执行测试套件,从而执行测试套件中的测试用例。先添加的先执行。

2、按测试类执行

  使用 makeSuite 可以实现把测试用例类中所有的测试用例组成测试套件 TestSuite,可以避免逐一向测试套件中添加测试用例。代码也在上面喔。

  注解:在测试套件中 TestSuite 类中,unittest 模块调用了 makeSuite 的方法,makeSuite 方法的参数是,testCaseClass,也是测试类,如下:

+ View Code

3、加载测试类

  使用 TestLoader 类来加载测试类,并将测试用例返回添加到 TestSuite 中,代码也在上面喔。

4、按测试模块执行

  在 TestLoader 类中也可以按模块来执行测试。python 中一个 .py 文件就是一个模块,一个模块可以有 N 个测试类,在一个测试类中可以有 N 个测试用例。如下:

+ View Code

  注解:模块是”按测试模块执行.py“,测试类分别是 BaiduTest 和 BaiduMap,这两个类执行不分先后,TestLoader 类直接调用 loadTestsFromModule 方法返回给指定模块中包含的所有参数用例套件。

5、优化测试套件

  可以单独地把测试套件写成一个方法来调用。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

from selenium import webdriver

import unittest

'''这里以加载测试类为例,把测试类套件写成一个单独的方法'''

class BaiduTest(unittest.TestCase):

    def setUp(self):

        self.driver = webdriver.Chrome()

        self.driver.maximize_window()

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

        self.driver.implicitly_wait(30)

 

    def tearDown(self):

        self.driver.quit()

 

    def test_baidu_news(self):

        '''验证:测试百度首页点击新闻后跳转'''

        self.driver.find_element_by_link_text('新闻').click()

        self.assertEqual(self.driver.current_url,'http://news.baidu.com/')

 

    def test_baidu_map(self):

        '''验证:测试百度首页点击地图后的跳转'''

        self.driver.find_element_by_link_text('地图').click()

        self.assertEqual(self.driver.current_url,'https://map.baidu.com/@13376484.03,3517857.39,12z')

 

@staticmethod

def suite(testCaseClass):

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

    return suite

 

if __name__ == '__main__':

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论