python Unitest和pytest 介绍和安装

前言

目前有两种纯测试的测试框架,pytest和unittest,这系列文章主要介绍pytest为主

UnitTest测试框架理论

  • python 自带的单元测试框架,常用在单元测试
  • 在自动化测试中提供用例组织与执行
  • 提供丰富的断言方法-验证函数等功能
  • 加上HTMLTestRunner可以生成html报告
  • 官方文档 https://docs.python.org/3/library/unittest.html

官方简单的例子

import unittest


class TestStringMethods(unittest.TestCase):
    # setUp代表执行函数测试前要做什么,每个函数前后都会执行一次
    def setUp(self) -> None:  # -> 表示返回了什么结果
        print("setup")

    # tearDown代表执行函数测试后要做什么
    def tearDown(self) -> None:
        print("teardown")

    @classmethod  # 下面两个实例,代表整个测试类的开始(setUpClass)前的操作和结束(tearDownClass)后的操作 只执行一次
    def setUpClass(cls) -> None:
        print('setUpclass---->')

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass---->')

    def test_abd(self):
        print('test_adb')

    def test_upper(self):
        print('test_upper')
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        print('test_isupper')
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        print("test_split")
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)


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

说明:

  • Unittest 提供了 test cases、 test suites、 test fixtures、 test runner等相关组件
  • 编写规范
    • 测试模块首先 import unittest
    • 测试类必须继承 unittest.TestCase
    • 测试方法必须以"test_"开头

实战:
测试一个search的类

import unittest


# 测试一个search的类
class Search:
    def serch_fun(self):
        print("search....")
        return True


class TestSearch(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.search = Search()
        print('setUpclass---->')

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass---->')

    def test_search(self):
        print('test_search111...')
        assert True == self.search.serch_fun()

    def test_searc2(self):
        print('test_search222...')
        assert True == self.search.serch_fun()

    def test_searc3(self):
        print('test_search333...')
        assert True == self.search.serch_fun()


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

Pytest简单介绍

非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
能够支持简单的单元测试和复杂的功能测试
支持参数化
执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
支持重复执行(rerun)失败的 case
支持运行由 nose, unittest 编写的测试 case
可生成 html 报告
方便的和持续集成工具 jenkins 集成
可支持执行部分用例
具有很多第三方插件,并且可以自定义扩展

Pytest安装

在Python的虚拟环境pip中直接输入

pip install pytest

创建一个简单的Demo, 文件名字为: test_demp.py

def func(x):
    return x + 1


def test_answer():
    assert func(3) == 5


class TestClass:
    def test_a(self):
        print('1')

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

注意:

  • 执行 pytest 时候 会查找当前目录及其子目录下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 开头函数并执行
  • 执行一个文件的时候就 pytest + 指定文件.py
  • Test类包含的所有test_的方法(测试类不能有__init__.py)

或者可以选择用Python的解释器执行, 在test_demo.py文件底下加上入口

if __name__ == '__main__':
    pytest.main(['test_demo.py'])

Pytest执行用例规则

1、运行test_demo.py 模块里面的某个函数,或者某个类,某个类里面的方法
加v和不加-v都可以,加-v的话,打印的信息更详细

pytest -v test_demo.py::TestClass::test_one

pytest test_demo.py::TestClass::test_one

pytest test_demo.py::test_answer

2、执行某个 匹配用例名称 -k

pytest -k test_a -v

3、-k 同时匹配不同的用例名称, 符合 test_a* 或者 test_b* 的函数都会进行测试

pytest -k "test_a or test_b" -v 

4、 (常用)参数化的方式生成多个测试用例, 在test_demo.py中更改代码 改为

@pytest.mark.parametrize('a,b', [(1, 2), (2, 3)])
def test_answer(a, b):
    assert func(a) == b

然后在控制台中执行: pytest -k test_answer -v

5、遇到需要在测试用例前进行的操作,比如登录,则需要在函数前加入装饰器fixture

# 同样改写的是test_demo.py, 在最外层写个函数
@pytest.fixture()
def login():
    print('登录之后')
    username = 'od'
    return username

然后在 TestClass 中调用
class TestClass:
    def test_a(self, login):
        print(f'login name is {login}')
        print('1')

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

    def test_c(self, login):
        print(f'login name is {login}')
        print('3')
#然后执行 
pytest -v -s
#-s 可以在控制台输出print的内容

这样就可以执行装饰器修饰的所有测试, 下一节学的是参数驱动的一些笔记

posted @ 2021-05-07 00:44  陈科科  阅读(639)  评论(0编辑  收藏  举报