pytest---pytest斷言(assert)


前言

  我們在寫自動化的過程中,用例的斷言也是至關重要的,斷言可以幫助我們判斷用例測試點是否成功和失敗。當然在我們這么強大的pytest框架中,斷言也是比較強大的。為什么?繼續往下看

pytest斷言

前面說到pytest的斷言比較強大,它直接可以使用python自帶的斷言內容,當然不止而已,pytest還有一個重要的功能是可以重寫assert關鍵字,pytest會截斷對python中自帶的assert的調用然后替換成自己定位的assert,從而可以獲取更多的錯誤信息,讓我們知道具體哪里出現了問題。

編寫一個加法進行通過斷言驗證

import pytest

class Test_01:

    def add(self,x,y):
            c = x + y
            return c

    def test_001(self):
        c = self.add(1,2)
        assert c == 4
if __name__ == '__main__':
    pytest.main(['-s'])

看到上面的代碼大家都知道是會失敗的, 那么我們一起看下pytest斷言會給我們增加哪些新的報錯信息。

從上圖的結果中可以看出帶“>”的是python自帶的錯誤解釋,而帶E的則是pytest進行添加的,這樣就能很清楚的看到錯誤信息,比如這個3==4結果是錯誤的。

增加斷言詳細信息

在編寫用例的時候,斷言的時候想要獲取一些更加有用的信息,比如參數化的時候,需要知道哪個參數進行傳入的,如果出錯了可以幫助我們進行調試,那么這一點pytest中的assert也可以幫助我們進行增加

import pytest

class Test_01:

    def add(self,x,y):
            c = x + y
            return c
def test_001(self): a = 1 b = 2 assert self.add(a,b) == 4 , '當前傳入的a值:%s,傳入的b值:%s' %(a,b)
if __name__ == '__main__': pytest.main(['-s'])

很清楚的看到了python自帶的assert和pytest增加的對比,python自帶的沒有把值傳入,pytest幫助我們把值傳入進去,更加清楚的幫助查看錯誤信息

異常斷言

pytest斷言方法內容應該沒有unittests多,但是比unittest更加方便,更加靈活。這里安靜在舉一個栗子。比如我們在執行一條錯誤的用例的時候,已經知道錯誤類型,這個時候我們也可以通過判斷這個錯誤類型,如果錯誤類型和預期一致,那么就直接通過用例,反之失敗。

安靜先寫一個錯誤的函數,然后找到他的錯誤類型,下面的函數錯誤類型為"AssertionError"

def cake():
        a = 'anjing'
        b = 'test_anjing'
        assert  a == b
cake()
------------執行結果--------------

 File "E:/auto_test/test_01.py", line 5, in <module>
    cake()
  File "E:/auto_test/test_01.py", line 4, in cake
    assert  a == b
AssertionError

這里可以使用 pytest.raises(錯誤類型)  進行對比斷言

import pytest

class Test_01:

    def cake(self):
        a = 'anjing'
        b = 'test_anjing'
        assert  a == b

    def test_001(self):
        print('Test_01下的用例001')
        with pytest.raises(AssertionError):
            self.cake()

if __name__ == '__main__':
    pytest.main(['-v'])

這個從表面上運行結果肯定是失敗的,因為a不等於b,但是加入pytest的斷言運行后就成功了

上文中的異常斷言,可以進行實例化,實例化過后存在三個可以用的方法,分別是.type,.value,.traceback安靜簡單的進行舉例說明

.type

我們這里也可以通過pytest.raises進行斷言,我們可以根據返回的tpye進行對比,查看我們預期的與實際的是否一致

import pytest

class Test_01:

    def cake(self):
        a = 'anjing'
        b = 'test_anjing'
        assert  a == b

    def test_001(self):
        print('Test_01下的用例001')
        with pytest.raises(AssertionError) as excinfo:
            self.cake()
        print('錯誤的類型是:%s' %excinfo.type)
        assert excinfo.type == AssertionError

if __name__ == '__main__':
    pytest.main(['-s'])

 

.value

如果還不知道具體的錯誤出現在哪里,我們也可以通過value進行查看具體的錯誤類型,

import pytest

class Test_01:

    def cake(self):
        a = 'anjing'
        b = 'test_anjing'
        assert  a == b

    def test_001(self):
        print('Test_01下的用例001')
        with pytest.raises(ZeroDivisionError) as excinfo:
            self.cake()
        print('錯誤的類型是:%s' %excinfo.type)
        print('錯誤的值:%s'%excinfo.value)
        assert excinfo.type == ZeroDivisionError

if __name__ == '__main__':
    pytest.main(['-s'])

 可以看出具體錯誤的值是assert中的兩個字符串不相等導致的。

 .traceback

這里這個方法表示可以把代碼中哪行出現了錯誤進行打印出來,此方法必須在str下進行打印。

 

pytest常用斷言

前面也介紹了pytest的斷言可以復用python的斷言,安靜簡單的列舉幾個python的斷言

1、判斷是否為真:  assert xx  

2、判斷不為真:  assert not xx  

3、判斷a是否包含b:  assert a in b  

4、判斷a不包含b: assert a not in b 

5、判斷兩值相等:  assert b == a  

6、判斷兩值不相等:  assert a != b  

 安靜對常用斷言簡單的舉幾個例子。

import pytest

class Test:

    def is_true(self):
        '''返回True'''
        return True

    def test_01(self):
        '''判斷是否為真'''
        assert self.is_true()

    def is_false(self):
        '''返回False'''
        return False

    def test_02(self):
        '''判斷不為真'''
        assert not self.is_false()

    def test_03(self):
        '''判斷是否相等'''
        a = 'test_anjing'
        b = 'test_anjing'
        assert a == b

    def test_04(self):
        '''判斷兩值不相等'''
        a = 'test_anjing'
        b = 'anjing'
        assert a != b

    def test_05(self):
        '''判斷a包含b'''
        a = 'test_anjing'
        b = 'anjing'
        assert b in a

    def test_06(self):
        '''判斷a不包含b'''
        a = 'anjing'
        b = 'test'
        assert b not in a

if __name__ == '__main__':
    pytest.main(['-v'])

 


免責聲明!

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



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