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的內容

這樣就可以執行裝飾器修飾的所有測試, 下一節學的是參數驅動的一些筆記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM