1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Pytest之?dāng)嘌?/h1>

        共 5711字,需瀏覽 12分鐘

         ·

        2020-08-06 23:27

        VOL 147

        04

        2020-08

        今天距2021年149天

        這是ITester軟件測(cè)試小棧第147次推文

        點(diǎn)擊上方藍(lán)字“ITester軟件測(cè)試小棧“關(guān)注我,每周一、、五早上?07:30準(zhǔn)時(shí)推送。


        微信公眾號(hào)后臺(tái)回復(fù)“資源、測(cè)試工具包”領(lǐng)取測(cè)試資源,回復(fù)“微信群一起進(jìn)群打怪。


        本文4633字,閱讀約需12分鐘





        在上一篇Pytest系列文章:Pytest之收集用例及命令行參數(shù),主要介紹Pytest用例收集規(guī)則及常用的命令行參數(shù)。

        在自動(dòng)化測(cè)試過(guò)程中,需要判斷預(yù)期結(jié)果和實(shí)際結(jié)果是否一致,這時(shí)需要使用到斷言。


        什么是斷言呢?簡(jiǎn)單來(lái)說(shuō)就是實(shí)際結(jié)果和期望結(jié)果去對(duì)比。





        斷言用法


        在pytest中,使用assert進(jìn)行斷言,格式為:assert 表達(dá)式。

        如果表達(dá)式返回結(jié)果為T(mén)rue,則斷言成功,否則斷言失敗。




        常用斷言


        unittest的三種斷言:

        assertIn(expect,result)斷言包含(被包含的寫(xiě)前面);

        assertEqual(expect,result)斷言相等;

        assertTure(條件)斷言是否為真。返回Ture或False;


        Pytest里的斷言實(shí)際上就是Python中的assert斷言方法,常用斷言方法如下:

        • assert xx :判斷 xx 為真;

        • assert not xx :判斷 xx 不為真;

        • assert a in b :判斷 b 包含 a;

        • assert a == b :判斷 a 等于 b;

        • assert a != b :判斷 a 不等于 b;


        import?pytest

        def?test_demo1():
        ????a?=?1
        ????assert?a

        def?test_demo2():
        ????a?=?0
        ????assert?not?a

        def?test_demo3():
        ????s?=?'hello'
        ????assert?'h'?in?s

        def?test_demo4():
        ????a?=?3
        ????assert?a?==?3

        def?test_demo5():
        ????a?=?4
        ????assert?a?!=?3

        if?__name__?==?'__main__':
        ????pytest.main()


        運(yùn)行結(jié)果如下:

        Testing?started?at?18:22?...
        C:\Users\96984\Desktop\code\pytest\venv\Scripts\python.exe?"C:\ruanjian\pycharm2019.3\PyCharm?2019.3.1\plugins\python\helpers\pycharm\_jb_pytest_runner.py"?--path?C:/Users/96984/Desktop/code/pytest/demo/demo_pytest.py
        Launching?pytest?with?arguments?C:/Users/96984/Desktop/code/learn_pytest/demo/demo_pytest.py?in?C:\Users\96984\Desktop\code\learn_pytest\demo
        =============================?test?session?starts?=============================
        platform?win32?--?Python?3.6.8,?pytest-5.4.3,?py-1.9.0,?pluggy-0.13.1?--?C:\Users\96984\Desktop\code\learn_pytest\venv\Scripts\python.exe
        cachedir:?.pytest_cache
        metadata:?{'Python':?'3.6.8',?'Platform':?'Windows-10-10.0.18362-SP0',?'Packages':?{'pytest':?'5.4.3',?'py':?'1.9.0',?'pluggy':?'0.13.1'},?'Plugins':?{'html':?'2.1.1',?'metadata':?'1.10.0'},?'JAVA_HOME':?'C:\\Program?Files\\Java\\jdk1.8.0_77'}
        rootdir:?C:\Users\96984\Desktop\code\learn_pytest\demo
        plugins:?html-2.1.1,?metadata-1.10.0
        collecting?...?collected?5?items
        demo_pytest.py::test_demo1?PASSED????????????????????????????????????????[?20%]
        demo_pytest.py::test_demo2?PASSED????????????????????????????????????????[?40%]
        demo_pytest.py::test_demo3?PASSED????????????????????????????????????????[?60%]
        demo_pytest.py::test_demo4?PASSED????????????????????????????????????????[?80%]
        demo_pytest.py::test_demo5?PASSED????????????????????????????????????????[100%]
        ==============================?5?passed?in?0.06s?==============================
        Process?finished?with?exit?code?0




        異常斷言


        在測(cè)試過(guò)程中,有時(shí)需要對(duì)特定異常進(jìn)行斷言,可以使用 pytest.raises 作為上下文管理器,當(dāng)拋出異常時(shí)可以獲取到對(duì)應(yīng)的異常實(shí)例。

        import?pytest
        def?test_zero_division():
        ????1?/?0
        if?__name__?==?'__main__':
        ????pytest.main()


        運(yùn)行結(jié)果:

        ==================================?FAILURES?===================================
        _____________________________?test_zero_division?______________________________
        ????def?test_zero_division():
        >???????1?/?0
        E???????ZeroDivisionError:?division?by?zero


        所以我們需要捕獲并斷言異常。

        斷言場(chǎng)景:斷言拋出的異常是否符合預(yù)期。

        預(yù)期結(jié)果:ZeroDivisionError: division by zero,其中ZeroDivisionError為錯(cuò)誤類(lèi)型,division by zero為具體錯(cuò)誤值。

        斷言方式: ?斷言異常的type和value值。


        斷言代碼如下:

        import?pytest
        def?test_zero_division_long():
        ????with?pytest.raises(ZeroDivisionError)?as?excinfo:
        ????????1?/?0
        ????#?斷言異常類(lèi)型?type
        ????assert?excinfo.type?==?ZeroDivisionError
        ????#?斷言異常?value?值
        ????assert?"division?by?zero"?in?str(excinfo.value)
        if?__name__?==?'__main__':
        ????pytest.main()

        代碼詳細(xì)說(shuō)明:

        ① pytest.raises 捕獲異常,源碼如下:

        def?raises(??#?noqa:?F811
        ????expected_exception:?Union["Type[_E]",?Tuple["Type[_E]",?...]],
        ????*args:?Any,
        ????**kwargs:?Any
        )
        ?->?Union["RaisesContext[_E]",?_pytest._code.ExceptionInfo[_E]]:

        ????__tracebackhide__?=?True
        ????for?exc?in?filterfalse(
        ????????inspect.isclass,?always_iterable(expected_exception,?BASE_TYPE)??#?type:?ignore[arg-type]??#?noqa:?F821
        ????):
        ????????msg?=?"exceptions?must?be?derived?from?BaseException,?not?%s"
        ????????raise?TypeError(msg?%?type(exc))
        ????message?=?"DID?NOT?RAISE?{}".format(expected_exception)
        ????if?not?args:
        ????????match?=?kwargs.pop("match",?None)
        ????????if?kwargs:
        ????????????msg?=?"Unexpected?keyword?arguments?passed?to?pytest.raises:?"
        ????????????msg?+=?",?".join(sorted(kwargs))
        ????????????msg?+=?"\nUse?context-manager?form?instead?"
        ????????????raise?TypeError(msg)
        ????????return?RaisesContext(expected_exception,?message,?match)
        ????else:
        ????????func?=?args[0]
        ????????if?not?callable(func):
        ????????????raise?TypeError(
        ????????????????"{!r}?object?(type:?{})?must?be?callable".format(func,?type(func))
        ????????????)
        ????????try:
        ????????????func(*args[1:],?**kwargs)
        ????????except?expected_exception?as?e:
        ????????????#?We?just?caught?the?exception?-?there?is?a?traceback.
        ????????????assert?e.__traceback__?is?not?None
        ????????????return?_pytest._code.ExceptionInfo.from_exc_info(
        ????????????????(type(e),?e,?e.__traceback__)
        ????????????)
        ????fail(message)
        raises.Exception?=?fail.Exception??#?type:?ignore



        ② excinfo作為異常信息實(shí)例,擁有type 、value等屬性,源碼如下:

        @property
        def?type(self)?->?"Type[_E]":
        ????"""the?exception?class"""
        ????assert?(
        ????????self._excinfo?is?not?None
        ????),?".type?can?only?be?used?after?the?context?manager?exits"
        ????return?self._excinfo[0]
        @property
        def?value(self)?->?_E:
        ????"""the?exception?value"""
        ????assert?(
        ????????self._excinfo?is?not?None
        ????),?".value?can?only?be?used?after?the?context?manager?exits"
        ????return?self._excinfo[1]


        ③ excinfo.value的值是元組,所以要轉(zhuǎn)成字符串。




        以上

        That‘s all
        更多系列文章
        敬請(qǐng)期待

        ITester軟件測(cè)試小棧
        往期內(nèi)容寵幸


        1.Python接口自動(dòng)化-接口基礎(chǔ)(一)

        2.Python接口自動(dòng)化-接口基礎(chǔ)(二)


        3.Python接口自動(dòng)化-requests模塊之get請(qǐng)求


        4.Python接口自動(dòng)化-requests模塊之post請(qǐng)求

        5.Python接口自動(dòng)化之cookie、session應(yīng)用


        6.Python接口自動(dòng)化之Token詳解及應(yīng)用


        7.Python接口自動(dòng)化之requests請(qǐng)求封裝


        8.Python接口自動(dòng)化之pymysql數(shù)據(jù)庫(kù)操作


        9.Python接口自動(dòng)化之logging日志


        10.Python接口自動(dòng)化之logging封裝及實(shí)戰(zhàn)

        想獲取更多最新干貨內(nèi)容
        快來(lái)星標(biāo) 置頂 關(guān)注
        每周一、三、五 07:30見(jiàn)

        << ?滑動(dòng)查看下一張圖片 ?>>


        ?后臺(tái)?回復(fù)"資源"取干貨
        回復(fù)"微信群"一起打怪升級(jí)

        測(cè)試交流Q群:727998947

        點(diǎn)亮一下在看,你更好看


        瀏覽 77
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)

        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            潘金莲一级特黄a大片 | 精品色999 | 黄色一级网 | 国产精品自拍小视频 | 亚洲天堂综合网 | 91AV视频乱伦视频国产乱伦 | 扒开粉嫩的小缝伸舌头58集 | 外国三级黄色片 | 男人天堂国产 | 久久超碰大香蕉 |