unittest自动化测试框架

unittest自动化测试框架

1.单元测试框架Unittest简介

单元测试:指的是在软件开发当中,对程序的最小单元(函数,方法)进行测试的过程。 unittest不仅可以用于单元测试,还可以用于自动化测试用例的开发和执行。组织执行自动 化测试用例。并且提供一些丰富的断言方法,判断用例是否通过,最终能够生成测试报告。

2.基本使用

2.1 基于Python的单元测试框架有哪些

框架名称unittestpytest
难易程度更简单,容易上手市场份额会更多
使用规则1.新建一个类,必须继承unittest.TestCase(耦合)
2.导入unitttest模块。Alt+Enter
3.测试用例必须以test_开头。
1.测试文件必须test_开头或者_test结尾。(非耦合)
2.测试类名必须Test开头
3.测试用例必须以test_开头
夹具的差异setUp/tearDown 在每个用例的前后执行
setUpClass/tearDownClass 在每个类的前后执行。
setup/teardown 在每个用例的前后执行
setup_class/teardown_class 在每个类的前后执行。
断言的差异self.assertEqual()python原生的assert
失败用例重跑差异没有支持
参数化差异ddt@pytest.mark.parametrize()

2.2 单元测试框架的作用

1.找到测试用例。根据他们的默认的测试用例的规则。(原理,底层。BAT。) 
2.执行测试用例。 
3.判断测试用例的结果。 
4.生成测试报告。 

2.3 unittest重要组件

TestCase测试用例:

TestSuite测试套件: 整理测试用例,形成一个集合。

TestLoader测试加载器: 加载测试用例套件或者测试用例。

TestFixtrue测试固件

TestRunner测试运行器:运行测试用例。

2.4 unittest如何运行测试用例

unittest的运行方式有两种:

**1.命令行的运行方式。(unittest默认的执行方式) **

python -m unittest test_api.py 
python -m unittest test_api.TestApi 
python -m unittest test_api.TestApi.test_baili 
python -m unittest -v test_api.py 
python -m unittest -v test_api.py -k *_baili 

python -m的意思就是以命令行的方式运行测试用例。

unitttest -v 表示以啰嗦的方式,详细的方式展示测试结果。

-k表示通过通配符匹配的方式去查找测试用例。

2.main方式运行

if __name__ == '__main__': 
print("-----------wwwww--------------") 
unittest.main() 

2.5 unittest的运行结果

字符含义
.代表成功。如果加了-v,那么.会变成OK
F代表用例执行失败
E出错 有异常抛出
S代表用例被跳过

2.6 unittest测试用例的执行顺序

ord() python的内置函数,作用是返回ASCII码。 根据ASCII的大小排序来执行测试用例。

2.7 多种unittest的加载方式和运行测试用例的方式

1.通过TestSuite加载多个测试用例的方式执行。

if __name__ == '__main__':  # 创建一个测试套件
    suite = unittest.TestSuite()
    # 把测试用例加载到测试套件里面
    suite.addTest(TestApi('test_01_mashang'))
    suite.addTest(TestApi('test_02_baili'))
    suite.addTest(TestWeb('test_01_login')) 
    # 执行时一定要指定套件
    unittest.main(defaultTest='suite')
if __name__ == '__main__':
    #创建一个测试套件
    suite = unittest.TestSuite()
    #把测试用例加载到测试套件里面
    testcases = [TestApi('test_01_mashang'),TestApi('test_02_baili'),TestWeb('test_01_login')] 
    suite.addTests(testcases)
    #执行时一定要指定套件
    unittest.main(defaultTest='suite')

2.加载一个目录下所有的测试用例

if __name__ == '__main__': 
    suite = unittest.defaultTestLoader.discover("./testcases", pattern='test _*.py') 
    unittest.main(defaultTest='suite')

九、为什么我们使用unittest.main()就可以执行所有的测试用例?

名称用法
TestCase测试用例
TestSuite测试套件:整理测试用例,形成一个集合。
TestLoader测试加载器:加载测试用例套件或者测试用例。
TestFixtrue测试固件
TestRunner测试运行器:运行测试用例。

如何工作.,底层原理如何实现。

类() 实例化一个对象,自动调用init方法。

module:测试用例所在的路径,__main__代表当前模块。

defaultTest:默认的待测试的测试用例或者测试套件的名称。

argv:接收外部传递给程序的参数testRunner:测试运行器

testLoader:测试加载器

exit:是否在测试用例结束之后退出程序

verbosity:显示详细信息的程度。

<0 只显示用例总数以及全局执行结果

1 默认值,显示用例总数以及全局执行结果外,还显示一个标记:

. F E,S

>=2 显示用例总数以及全局执行结果外,显示详解结果

(1)测试加载器已经初始化

1 def init(self, module=‘main’, defaultTest=None, argv=None,

2 testRunner=None, testLoader=loader.defaultTestLoader,

3 exit=True, verbosity=1, failfast=None, catchbreak=None,

4 buffer=None, warnings=None, *, tb_locals=False):

(2) 通过测试加载器加载测试用例保存到self.test

1 def createTests(self, from_discovery=False, Loader=None):

2 if self.testNamePatterns:

3 self.testLoader.testNamePatterns = self.testNamePatterns

4 if from_discovery:

5 loader = self.testLoader if Loader is None else Loader()

6 self.test = loader.discover(self.start, self.pattern, self.top)

7 elif self.testNames is None:

8 self.test = self.testLoader.loadTestsFromModule(self.module)

9 else:

10 self.test = self.testLoader.loadTestsFromNames(self.testNames,

11 self.module)

(3) 创建文本测试运行器

1 if self.testRunner is None:

2 self.testRunner = runner.TextTestRunner

最后通过:self.result = testRunner.run(self.test)执行已经加载好的测试用

例。并且把结果放到self.result

2.9unittest夹具

setUp/tearDown 在每个用例的前后执行setUpClass/tearDownClass 在每个类的前后执行。

setUpModule/tearDownModule 在每个模块的前后执行

import unittest

class TestApi(unittest.TestCase):

    def setUp(self) -> None:
        print("在每一个测试用例之前执行:打开浏览器,加载网页")

    def tearDown(self) -> None:
        print("在每一个测试用例之后执行:关闭浏览器")

    @classmethod
    def setUpClass(cls) -> None:
        print("‐‐‐‐‐‐在每个类之前执行:初始化日志对象,创建数据库连接‐‐‐‐‐‐‐‐")

    @classmethod
    def tearDownClass(cls) -> None:
        print("‐‐‐‐‐‐在每个类之后执行:销毁日志对象,销毁数据库连接‐‐‐‐‐‐‐‐")

    def test_01_mashang(self):
        print("码尚教育软件测试")

    def test_02_baili(self):
        print("码尚百里")

    def test_03_weiwei(self):
        print("码尚微微")

    def test_04_qingtian(self):
        print("码尚晴天")
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值