pytest使用小結

1、pytest簡潔和好處html

  • 自動發現測試用例 testloader
  • 斷言方便 ,自定義錯誤提示 assert 正則匹配
  • 靈活運行指定的測試用例,指定模塊,制定測試類,測試用例 -k 標籤化,迴歸 正向 冒煙 登錄
  • 環境管理靈活。
  • 豐富的插件,測試報告,插件介紹 allure(比較成熟的測試報告體系,unittest不支持這個插件)
  • 和unittest / nose兼容,pytest中標籤、生成allure、分析最慢的測試用例和unittest兼容

unittest的好處:python

1.標準庫,兼容性好web

2.更加容易理解windows

pytest和unittest兼容是有條件的,pytest使用如下功能就不能和unittes兼容:api

  • parametrize
  • fixture(autouse=True的能夠) 不能和setUp同時使用
  • Custom hooks

2、自動發現測試用例原理,命名方式瀏覽器

  • 文件名必須以test_*.py 和 *_test.py開頭或結尾,
  • 若是有類名,必須以Test開頭,沒有__init__函數,測試方法名以test_開頭的函數
  • 沒有類,那麼以函數爲單位的函數名必須以test_開頭

 3、斷言: 自定義提示文案session

assert 1==1, "提示文案"

4、運行方式app

1.在控制檯指定執行範圍編輯器

  • 在指定文件中輸入pytest,此時會收集該文件中全部測試用例
  • 指定某個模塊,例如 pytest test_demo1.py
  • 指定某個目錄及其子目錄的全部測試文件,pytest 文件名,例pytest testcase
  • 指定某個模塊下某個類的某個用例,pytest 模塊名::類名::方法名,例pytest test_demo2.py::TestDemo2::test_success
  • 指定某個模塊下的某個方法,pytest 模塊名::方法名,例pytest test_demo1.py::test_fail
  • python -m pytest/unittest

2.編輯器函數

Run -->Run...-->Edit Configurations-->+ -->python test -->pytest -->Run

3.經過python代碼執行pytest

 直接執行pytest.main(),自動查找當前目錄下,以test_開頭的文件或者以_test結尾的py文件

 

 5、自定義查找規則(在根目錄下pytest.ini)

[pytest]

python_files =
  test_*.py
  check_*.py
  example_*.py
python_functions = *_test
python_classes = *Suite

4、mark隨機測試(冒煙測試,給測試用例打標籤)

第一步:mark註冊,新建ini文件

#pytest.ini

[pytest]
markers = 
  login
  demo

第二步:

1.把標籤貼到測試用例(方法)上,一個測試用例上能夠貼多個標籤,標籤不只能夠貼到測試用例上,還能夠貼到測試類上

@pytest.mark.標籤名

2.貼標籤第二種方法:標記在測試類中,固定寫法

pytestmark = [pytest.mark.標籤名, pytest.mark.標籤名]

import pytest


class TestDemo4:
    pytestmark = [pytest.mark.login]
    
    # @pytest.mark.login
    def test_demo_4(self):
        assert 1 == 1

第三步:運行的時候指定標籤,在Terminal輸入pytest -m "mark1 and not mark2"

注意:必定要使用雙引號,單引號會報錯

5、跳過函數

@pytest.mark.skip(reason='out-of-data api')

# skipif 當知足某個條件時就跳過

@pytest.mark.skipif(sys.plafform == "win32", reason="does not run on windows")

# 跳過預見錯誤

@pytest.mark.xfail(gen.__version__ < '0.2.0', reason='not supported until v0.2.0')

def test_api():

  id_1 = gen.unique_id()

  id_2 = gen.unique_id()

  assert id_1 != id_2

6、pytest的用例執行順序

pytest有本身內置的執行順序規則,通常從上到下,能夠經過安裝插件pytest.ordering:run your tests in order

7、參數化

ddt數據驅動只是unittest支持數據驅動的一種庫 ddt != 數據驅動

ddt模塊不能和fixture共用,因此要換用pytest的參數化實現ddt

參數化會和unittest衝突,由於setUp這些東西都不會運行了!要改爲pytest,不要繼承unittest.TestCase

方法一:使用pytest.mark.parametrize()方式進行參數化

import pytest

Data = [1, 2, 3]

@pytest.mark.parametrize("data", Data)
def test_mock(data):
    print('測試開始')
    assert data == 2, "備註信息"

方法二:使用pytest.fixture()方式進行參數化,fixture裝飾的函數能夠做爲參數傳入其餘函數

1.在固件中添加返回值

2.而後在測試方法中傳入固件

3.在測試方法中,用固件名來表示其返回值

test_demo.py

import pytest


class TestDemo1:
    # 定義參數列表
    list_a = [1, 2, 3]
    
    # 定義固件名is_success,並設置返回值
    @pytest.fixture(params=list_a)
    def is_success(self, request):
        return request.param
    
    # 在測試方法中傳入固件名
    @pytest.mark.success
    def test_success(self, is_success):
        assert is_success == 1

方法三:測試數據和用例分離

能夠採用conftest.py文件存儲參數化數據和函數,模塊下的用例執行時,會自動讀取conftest.py文件中的數據

1.先定義一個固件is_success

conftest.py

import pytest

# 準備測試數據
list_a = [1, 2, 3]


# params中須要傳入list
@pytest.fixture(params=list_a)
def is_success(request):
    return request.param

2.在測試類中傳入固件名稱

test_demo4.py

import pytest


class TestDemo4:

    @pytest.mark.test
    def test_demo_4(self, is_success):
        # print('測試一下')
        assert is_success == 1

8、fixture的使用(原文連接:https://blog.csdn.net/BearStarX/article/details/101000516

fixture相對於setUp和tearDown來講的優點:

  • 命名方式靈活,不侷限於setUp和tearDown這幾個命名
  • conftest.py配置裏能夠實現數據共享,不須要import就能自動找到一些配置
  • scope = "module"能夠實現多個.py跨文件共享前置
  • scope = "session"能夠實現多個.py跨文件使用一個session來完成多個用例

經過yield生成器實現了前置條件和後置條件的組合

1.先在根目錄conftest.py文件中定義一個名爲init_web的固件

import pytest

@pytest.fixture()
def init_web():
  print("啓動瀏覽器")
  yield driver
  print("關閉瀏覽器")

2.做爲參數傳到測試用例中

def test_demo(init_web):

3.接收這個東西

driver = init_web

import pytest


class TestDemo3:

    @pytest.mark.login
    def test_demo3(self, init_web):
        driver = init_web
        assert driver == 2

注意:

1.pytest 運行默認不會打印固件中print(),若是想打印,那麼使用python -m login -s 或者 pytest --capture=no

9、重運行

安裝插件:pip install pytest -rerunfailures

pytest --reruns 3 --reruns-delay 5

10、測試報告

各類插件地址:https://plugincompat.herokuapp.com/

html:--html=\report\demo.html

須要安裝:

pip install pytest-html

# log

--resultlog=report/demo.txt  相對路徑

# xml,jenkins使用

--junitxml=report/demo.xml  

# html

--html=report/demo.html

 main.py

import pytest


if __name__ == '__main__':
    pytest.main(['-m test', '-s',
                 '--resultlog=report/demo.txt',
                 '--junitxml=report/demo.xml',
                 '--html=report/demo.html'])

在Terminal輸入:python main.py

查看結果:在根目錄下會生成一個含有各類報告的report文件夾
 

相關文章
相關標籤/搜索