欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unittest框架的使用方法

程序员文章站 2024-03-21 23:14:58
...

一、UnitTest框架的使用

  • python自带的一个单元测试的测试框架
  • 可以结合selenium、request实现UI和接口的自动化测试
  • 无需额外安装,python中已经加载了UnitTest框架
import unittest
  • UnitTest框架中,有以下几个组件:
  1. test fixture :setUp(前置条件),tearDown(后置条件),用于初始化测试用例、清理释放资源
  2. test case :测试用例,以继承unittest.TestCase实现用例的继承,在UnitTest中,测试用例都通过test识别,所以在每个用例的命名上,必须要带上test,否则就不会识别
  3. test suite :测试套件,即测试用例集,list = (case1,case2…)
  4. test runner :运行器,通过runner调用suite执行测试
  5. test report:生成测试报告

其对应关系为:

 Unittest框架的使用方法

  •  UnitTest的运行机制:通过定义unittest.main()方法即可
import unittest

class Demo01(unittest.TestCase):

    #类的初始化
    @classmethod
    def setUpClass(cls) -> None:
        print('class')

    #类的资源释放
    @classmethod
    def tearDownClass(cls) -> None:
        print('tclass')

    #初始化
    def setUp(self) -> None:
        print('setUp')

    #释放资源
    def tearDown(self) -> None:
        print('tearDown')

    #测试用例
    def test_a(self):
        print('a')
    def test_b(self):
        print('b')

if __name__=='__main__':
    unittest.main()

二、UnitTest断言

  • Unittest中,Testcast有封装好的断言方法进行断言,用于判断case通过或失败
  • 如果断言通过, 测试会继续执行到下一行的代码
  • 如果断言失败, 对应的case测试会立即停止或者生成错误信息,但是不要影响其他的case执行
以下是常见的一些断言方法:
 
序号 断言方法 断言描述
1 assertEqual(arg1, arg2, msg=None) 验证arg1=arg2,不等则fail
2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
3 assertTrue(expr, msg=None) 验证exprtrue,如果为false,则fail
4 assertFalse(expr,msg=None) 验证exprfalse,如果为true,则fail
5 assertIs(arg1, arg2, msg=None) 验证arg1arg2是同一个对象,不是则fail
6 assertIsNot(arg1, arg2, msg=None) 验证arg1arg2不是同一个对象,是则fail
7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
8 assertIsNotNone(expr, msg=None) 验证expr不是None,是则fail

下面举例说明断言语句如何编写:

self.assertEqual("admin", driver.find_element_by_link_text("admin").text)

三、测试用例执行顺序

  • unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 0~9,A~Z,a~z
  • 以下面的代码来看,执行顺序即为:test_1 ==> test_2 ==> test_3
# coding:utf8
import unittest
from selenium import webdriver
import time

class forTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Firefox()
        self.driver.get("http://www.baidu.com")
        
    def tearDown(self) -> None:
        time.sleep(5)
        self.driver.quit()
    
    def test_1(self):
        self.driver.find_element_by_id("kw").send_keys("大虞海棠")
        self.driver.find_element_by_id("su").click()

    def test_2(self):
        self.driver.find_element_by_id("kw").send_keys("欣风雪雨")
        self.driver.find_element_by_id("su").click()

    def test_3(self):
        self.driver.find_element_by_id("kw").send_keys("宅欣棠雪")
        self.driver.find_element_by_id("su").click()

if __name__ == '__main__':
    unittest.main()

四、UnitTest.skip用法

  • 在case中,如果需要忽略某些用例或者特定条件下不执行的用例,那么就可以使用skip
  • skip 是通过装饰器执行,无条件执行跳过操作,有一个参数,传入的内容会在控制台显示
  • 如果使用 skipIf 将会有条件的执行跳过操作
# coding:utf8
import unittest
from selenium import webdriver

class Demo03(unittest.TestCase):
    #初始化
    def setUp(self):
        print('setUp')

    #释放资源
    def tearDown(self):
        print('tearDown')

    #测试用例
    #无条件执行跳过操作
    @unittest.skip('不需要运行该条用例')
    def test_a(self):
        print('1')

    def test_b(self):
        print('2')

    # 有条件执行跳过操作
    @unittest.skipIf(1 < 2, '如果if条件是true就跳过')
    def test_c(self):
        print('3')

    def test_d(self):
        print('4')

    @unittest.skipUnless(1 > 2, '如果unless条件是false就跳过')
    def test_e(self):
        print('5')

if __name__=='__main__':
    unittest.main()

Unittest框架的使用方法

五、测试套件suite与Runner

  • 方式一可以约定测试用例的执行顺序,让测试用例不必根据默认执行顺序执行
  • 方式二是将测试用例组装成一个list
  • 方式三是通过路径来访问每个类中的测试用例
  • 方式四是根据具体的类执行某个类中所有的测试用例
# coding:utf8
import unittest
from demo.Demo03 import *

#创建一个测试套件
suite = unittest.TestSuite()

#给套件中添加测试用例

#方式一
suite.addTest(Demo03('test_2'))
suite.addTest(Demo03('test_1'))
suite.addTest(Demo03('test_3'))

#方式二
#case = [Demo03('test_2'), Demo03('test_1'), Demo03('test_3')]
#suite.addTests(case)

#方式三
#test_dir = './'
#discover = unittest.defaultTestLoader.discover(start_dir=test_dir, pattern='Demo*.py')

#方式四
#suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))

#通过TextTestRunner对象运行unittest.main()
runner = unittest.TextTestRunner()
runner.run(suite)

六、TestRoport测试报告

  • 首先下载HTMLTestRunner.py 文件,下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html
  • 因为HTMLTestRunner原先是适用于python2,所以需要对文件进行一些修改,然后导入到site-packages/lib文件夹中
# coding:utf-8
import unittest, os
from demo.Demo03 import *
from HTMLTestRunner import HTMLTestRunner

#创建一个测试套件
suite = unittest.TestSuite()

report_name = '测试报告名称'
report_title = '测试报告标题'
report_desc = '测试报告描述'
report_path = './report/'
report_file = report_path+'report.html'
if not os.path.exists(report_path):
    os.mkdir(report_path)
else:
    pass
with open(report_file, 'wb') as report:
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo03))
    runner = HTMLTestRunner(steam=report, title=report_title, desc=report_desc)
    runner.run(suite)
report.close()

七、DDT数据驱动

. 可以看出上面的每一个测试用例都是有重复的地方,所以采用DDT来简化代码,DDT包含类的装饰器ddt和两个方法装饰器data

  • data::包含的参数与要输入测试的值一样多。
  • file_data:将从JSON或YAML文件加载测试数据。

注:只有以“.yml”和“.yaml”结尾的文件作为YAML文件加载。所有其他文件都以JSON文件的形式加载。且文件如果是列表,那么列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。

from ddt import ddt,data,file_data,unpack
import unittest

@ddt
class MyTestDdt(unittest.TestCase):
    def setUp(self):
        print('start')

    @data(2,4)#使用data传参数给测试用例
    def test_one(self,value):
        print(f'the @data number is :{value}')

    def tearDown(self):
        print('end')

if __name__ == '__main__':
    unittest.main(verbosity=2)

 

相关标签: 2020 软件测试