1.ddt软件有什么作用
2.Python - pytest
3.xlrd实现从excel文件读取数据
4.python单元测试框架之unittest和pytest的区别
5.Python接口自动化之yaml配置文件
6.Python热门单元测试框架对比:pytest和unittest还傻傻分不清楚?
ddt软件有什么作用
DDT(Data-Driven Testing,数据驱动测试)软件在软件测试领域中具有显著作用。它通过将测试数据与测试逻辑分离,显著提高了测试的可维护性和可扩展性。具体来说,DDT允许测试人员将测试数据存储在外部数据源中,-46的源码如Excel表格、CSV文件或数据库中,而不是硬编码在测试脚本中。这样做的好处在于,当测试数据发生变化时,测试人员只需修改外部数据源,而无需修改测试代码,从而大大减少了测试维护的工作量。
此外,DDT还支持通过解析外部数据源来动态生成测试用例并执行测试,这使得测试人员能够轻松地扩展测试数据和测试用例的规模。这种能力在需要对大规模、多样化的测试数据进行测试时尤为重要,如算法验证、接口测试、数据库操作测试和兼容性测试等场景。
对于Python开发者而言,ddt(Dynamic Data Test)是一个构建于unittest库之上的扩展,它通过装饰器将数据与测试函数关联起来,使得每个测试函数都能运行多组输入数据,从而进一步简化了测试用例的编写和维护。综上所述,DDT软件在提升测试效率、降低维护成本以及支持大规模测试方面发挥着重要作用。
Python - pytest
ç®å½pytestæ¯Pythonçåå æµè¯æ¡æ¶ï¼åèªå¸¦çunittestæ¡æ¶ç±»ä¼¼ï¼ä½pytestæ¡æ¶ä½¿ç¨èµ·æ¥æ´ç®æ´ï¼æçæ´é«ã
pytestç¹ç¹
å®è£
æµè¯
å¨æµè¯ä¹åè¦åçåå¤
æçæ¼ç¤ºèæ¬å¤äºè¿æ ·ä¸ä¸ªçç®å½ä¸ï¼
踩åï¼ä½ å建çpytestèæ¬å称ä¸ä¸å 许å«æ . ï¼æ¯å¦ 1.ç®åä¸æ.py ï¼è¿æ ·ä¼æ¥éãå½ç¶ï¼å¯ä»¥è¿ä¹å 1-ç®åä¸æ.py
demo1.py ï¼
ä¸ä¾ä¸ï¼å½æ们å¨æ§è¡ï¼å°±åPython解éå¨æ§è¡æ®éçPythonèæ¬ä¸æ ·ï¼æµè¯ç¨ä¾çæ¶åï¼ pytest.main(["-s",外卖管家源码 "demo1.py"]) ä¸çä¼ åéè¦æ¯ä¸ä¸ªå ç»æè å表ï¼æçpytestæ¯5.2.2çæ¬ï¼ï¼ä¹åççæ¬å¯è½éè¦è¿ä¹è°ç¨ pytest.main("-s demo1.py") ï¼ä¼ çåæ°æ¯strçå½¢å¼ï¼è³äºä½ 使ç¨åªç§ï¼åå³äºæ¥ä¸æ¥éï¼
éå°ä¸è¿°æ¥éï¼å°±æ¯åæ°éè¦ä¸ä¸ªå表æè å ç»çå½¢å¼ï¼èæ们使ç¨çæ¯strå½¢å¼ã
ä¸è¿°ä»£ç æ£ç¡®çæ§è¡ç»ææ¯è¿æ ·çï¼
大è´çä¿¡æ¯å°±æ¯åè¯æ们:
pytest.main(["-s", "demo1.py"])åæ°è¯´æ
é¤äºä¸è¿°çå½æ°è¿ç§åæ³ï¼ä¹å¯ä»¥æç¨ä¾ç±»çåæ³ï¼
ç¨æ³è·unittestå·®ä¸å¤ï¼ç±»åè¦ä»¥ Test å¼å¤´ï¼å¹¶ä¸å ¶ä¸çç¨ä¾æ¹æ³ä¹è¦ä»¥ test å¼å¤´ï¼ç¶åæ§è¡ä¹ä¸æ ·ã
æ§è¡ç»æï¼
é£ä¹ï¼ä½ è¿ä¸ªæ¶åå¯è½ä¼é®ï¼æè®°å¾unittestä¸æsetupåteardownçæ¹æ³ï¼é¾épytestä¸æ²¡æåï¼ä½ æä¹æé½ä¸æï¼ç¨³ä½ï¼çæ¡æ¯æçã
æ¥ä¸æ¥ï¼æ们æ¥ç 究ä¸ä¸pytestä¸çsetupåteardownçç¨æ³ã
æ们ç¥éï¼å¨unittestä¸ï¼setupåteardownå¯ä»¥å¨æ¯ä¸ªç¨ä¾ååæ§è¡ï¼ä¹å¯ä»¥å¨ææçç¨ä¾éæ§è¡ååæ§è¡ãé£ä¹å¨pytestä¸ï¼æ以ä¸å ç§æ åµï¼
æ¥ä¸ä¸ççåèªçç¨æ³ã
模å级å«setup_module/teardown_module
æ§è¡ç»æï¼
类级å«çsetup_class/teardown_class
æ§è¡ç»æï¼
ç±»ä¸æ¹æ³çº§å«çsetup_method/teardown_method
æ§è¡ç»æï¼
å½æ°çº§å«çsetup_function/teardown_function
æ§è¡ç»æï¼
å°ç»
该èæ¬æå¤ç§è¿è¡æ¹å¼ï¼å¦æå¤äºPyCharmç¯å¢ï¼å¯ä»¥ä½¿ç¨å³é®æè ç¹å»è¿è¡æé®è¿è¡ï¼ä¹å°±æ¯å¨pytestä¸ç主å½æ°ä¸è¿è¡ï¼
ä¹å¯ä»¥å¨å½ä»¤è¡ä¸è¿è¡ï¼
è¿ç§æ¹å¼ï¼è·ä½¿ç¨Python解éå¨æ§è¡Pythonèæ¬æ²¡æä»ä¹ä¸¤æ ·ãä¹å¯ä»¥å¦ä¸é¢è¿ä¹æ§è¡ï¼
å½ç¶ï¼è¿æä¸ç§æ¯ä½¿ç¨é ç½®æ件è¿è¡ï¼æ¥ççæä¹ç¨ã
å¨é¡¹ç®çæ ¹ç®å½ä¸ï¼æ们å¯ä»¥å»ºç«ä¸ä¸ª pytest.ini æ件ï¼å¨è¿ä¸ªæ件ä¸ï¼æ们å¯ä»¥å®ç°ç¸å ³çé ç½®ï¼
é£è¿ä¸ªé ç½®æ件ä¸çå项é½æ¯ä»ä¹ææå¢ï¼
é¦å ï¼ pytest.ini æä»¶å¿ é¡»ä½äºé¡¹ç®çæ ¹ç®å½ï¼èä¸ä¹å¿ é¡»å«å pytest.ini ã
å ¶ä»çåæ°ï¼
OKï¼æ¥ä¸ªç¤ºä¾ã
é¦å ï¼ï¼è¯¦ç»ç®å½åèå¼å¤´çç®å½ç»æï¼å¨ scripts/test_case_.py ä¸ï¼
å¨ scripts/test_case_dir1/test_case.py ä¸ï¼
é£ä¹ï¼å¨ä¸åçç®å½æè æ件ä¸ï¼å ±æ5个ç¨ä¾å°è¢«æ§è¡ï¼èç»æåæ¯ä¸¤ä¸ªå¤±è´¥ä¸ä¸ªæåãæ¥æ§è¡éªè¯ä¸ä¸ï¼å 为æäºé ç½®æ件ï¼æ们å¨ç»ç«¯ä¸ï¼åææ¯å¨é¡¹ç®çæ ¹ç®å½ï¼ï¼ç´æ¥è¾å ¥ pytest å³å¯ã
ç±æ§è¡ç»æå¯ä»¥åç°ï¼ 2 failed, 3 passed ï¼è·æ们çé¢æä¸è´ã
åç»æ§è¡ç¸å ³é ç½®é½æ¥èªé ç½®æ件ï¼å¦ææ´æ¹ï¼ä¼æç¸åºè¯´æï¼ç»ç«¯é½æ¯ç´æ¥ä½¿ç¨ pytest æ§è¡ã
æ们ç¥éå¨unittestä¸ï¼è·³è¿ç¨ä¾å¯ä»¥ç¨ skip ï¼é£ä¹è¿åæ ·æ¯éç¨äºpytestã
æ¥çæä¹ä½¿ç¨ï¼
è·³è¿ç¨ä¾ï¼æä»¬ä½¿ç¨ @pytest.mark.skipif(condition, reason) ï¼
ç¶åå°å®è£ 饰å¨éè¦è¢«è·³è¿ç¨ä¾ççå½æ°ä¸é¢ã
ææå¦ä¸ï¼
ä¸ä¾æ§è¡ç»æç¸å¯¹è¯¦ç»ï¼å 为æ们å¨é ç½®æ件ä¸ä¸º addopts å¢å äº -v ï¼ä¹åç示ä¾ç»æä¸ï¼æ²¡æå ï¼
å¦å¤ï¼æ¤æ¶ï¼å¨è¾åºçæ§å¶å°ä¸ï¼ è¿æ æ³æå°åº reason ä¿¡æ¯ï¼å¦æéè¦æå°ï¼åå¯ä»¥å¨é ç½®æ件ä¸ç addopts åæ°ç -s å为 -rs ï¼
å¦ææ们äºå ç¥éæµè¯å½æ°ä¼æ§è¡å¤±è´¥ï¼ä½åä¸æ³ç´æ¥è·³è¿ï¼èæ¯å¸ææ¾ç¤ºçæ示ã
Pytest ä½¿ç¨ pytest.mark.xfail å®ç°é¢è§é误åè½ï¼ï¼
éè¦ææ¡çå¿ ä¼ åæ°çæ¯ï¼
é£ä¹å ³äºé¢æ失败çå ç§æ åµéè¦äºè§£ä¸ä¸ï¼
ç»æå¦ä¸ï¼
pytest ä½¿ç¨ x 表示é¢è§ç失败ï¼XFAILï¼ã
å¦æé¢è§çæ¯å¤±è´¥ï¼ä½å®é è¿è¡æµè¯å´æåéè¿ï¼pytest ä½¿ç¨ X è¿è¡æ è®°ï¼XPASSï¼ã
èå¨é¢æ失败ç两ç§æ åµä¸ï¼æ们ä¸å¸æåºç°é¢æ失败ï¼ç»æå´æ§è¡æåäºçæ åµåºç°ï¼å 为è·æ们æ³çä¸ä¸æ ·åï¼æé¢æè¿æ¡ç¨ä¾å¤±è´¥ï¼é£è¿æ¡ç¨ä¾å°±åºè¯¥æ§è¡å¤±è´¥æ对ï¼ä½ è½ç¶æ§è¡æåäºï¼ä½è·ææ³çä¸ä¸æ ·ï¼ä½ ç §æ ·æ¯å¤±è´¥çï¼
æ以ï¼æ们éè¦å°é¢æ失败ï¼ç»æå´æ§è¡æåäºçç¨ä¾æ 记为æ§è¡å¤±è´¥ï¼å¯ä»¥å¨ pytest.ini æ件ä¸ï¼å å ¥ï¼
è¿æ ·å°±å°±æä¸è¿°çæ åµæ 记为æ§è¡å¤±è´¥äºã
pytest身为强大çåå æµè¯æ¡æ¶ï¼é£ä¹åæ ·æ¯æDDTæ°æ®é©±å¨æµè¯çæ¦å¿µãä¹å°±æ¯å½å¯¹ä¸ä¸ªæµè¯å½æ°è¿è¡æµè¯æ¶ï¼é常ä¼ç»å½æ°ä¼ éå¤ç»åæ°ãæ¯å¦æµè¯è´¦å·ç»éï¼æ们éè¦æ¨¡æåç§åå¥ç¾æªçè´¦å·å¯ç ã
å½ç¶ï¼æ们å¯ä»¥æè¿äºåæ°åå¨æµè¯å½æ°å é¨è¿è¡éåãä¸è¿è½ç¶åæ°ä¼å¤ï¼ä½ä»ç¶æ¯ä¸ä¸ªæµè¯ï¼å½æç»åæ°å¯¼è´æè¨å¤±è´¥ï¼æµè¯ä¹å°±ç»æ¢äºã
éè¿å¼å¸¸æè·ï¼æ们å¯ä»¥ä¿è¯ç¨ææåæ°å®æ´æ§è¡ï¼ä½è¦åææµè¯ç»æå°±éè¦åä¸å°é¢å¤çå·¥ä½ã
å¨ pytest ä¸ï¼æ们ææ´å¥½ç解å³æ¹æ³ï¼å°±æ¯åæ°åæµè¯ï¼å³æ¯ç»åæ°é½ç¬ç«æ§è¡ä¸æ¬¡æµè¯ã使ç¨çå·¥å ·å°±æ¯ pytest.mark.parametrize(argnames, argvalues) ã
使ç¨å°±æ¯ä»¥è£ 饰å¨çå½¢å¼ä½¿ç¨ã
åªæä¸ä¸ªåæ°çæµè¯ç¨ä¾
æ¥çï¼éè¦é¨åï¼ç»æï¼ï¼
å¯ä»¥çå°ï¼å表å çæ¯ä¸ªææºå·ï¼é½æ¯ä¸æ¡æµè¯ç¨ä¾ã
å¤ä¸ªåæ°çæµè¯ç¨ä¾
ï¼éè¦é¨åï¼ç»æï¼
å¯ä»¥çå°ï¼æ¯ä¸ä¸ªææºå·ä¸æ¯ä¸ä¸ªéªè¯ç é½ç»åä¸èµ·æ§è¡äºï¼è¿æ ·å°±æ§è¡äº4次ãé£ä¹å¦ææå¾å¤ä¸ªç»åçè¯ï¼ç¨ä¾æ°å°ä¼æ´å¤ãæ们å¸æææºå·ä¸éªè¯ç ä¸ä¸å¯¹åºç»åï¼ä¹å°±æ¯åªæ§è¡ä¸¤æ¬¡ï¼æä¹æå¢ï¼
å¨å¤åæ°æ åµä¸ï¼å¤ä¸ªåæ°åæ¯ä»¥ , åå²çå符串ãåæ°å¼æ¯å表åµå¥çå½¢å¼ç»æçã
åºä»¶ï¼Fixtureï¼æ¯ä¸äºå½æ°ï¼pytest ä¼å¨æ§è¡æµè¯å½æ°ä¹åï¼æä¹åï¼å è½½è¿è¡å®ä»¬ï¼ä¹ç§°æµè¯å¤¹å ·ã
æ们å¯ä»¥å©ç¨åºä»¶åä»»ä½äºæ ï¼å ¶ä¸æ常è§çå¯è½å°±æ¯æ°æ®åºçåå§è¿æ¥åæåå ³éæä½ã
Pytest ä½¿ç¨ pytest.fixture() å®ä¹åºä»¶ï¼ä¸é¢æ¯æç®åçåºä»¶ï¼è®¿é®ä¸»é¡µåå¿ é¡»å ç»å½ï¼
ç»æï¼
å¨ä¹åç示ä¾ä¸ï¼ä½ å¯è½ä¼è§å¾ï¼è¿è·ä¹åçsetupåteardownçåè½ä¹ç±»ä¼¼åï¼ä½æ¯ï¼fixtureç¸å¯¹äºsetupåteardownæ¥è¯´æ´çµæ´»ãpytestéè¿ scope åæ°æ¥æ§å¶åºä»¶ç使ç¨èå´ï¼ä¹å°±æ¯ä½ç¨åã
æ¯å¦ä¹åçloginåºä»¶ï¼å¯ä»¥æå®å®çä½ç¨åï¼
å¾å¤æ¶åéè¦å¨æµè¯åè¿è¡é¢å¤çï¼å¦æ°å»ºæ°æ®åºè¿æ¥ï¼ï¼å¹¶å¨æµè¯å®æè¿è¡æ¸ çï¼å ³éæ°æ®åºè¿æ¥ï¼ã
å½æ大ééå¤çè¿ç±»æä½ï¼æä½³å®è·µæ¯ä½¿ç¨åºä»¶æ¥èªå¨åææé¢å¤çååå¤çã
Pytest ä½¿ç¨ yield å ³é®è¯å°åºä»¶å为两é¨åï¼ yield ä¹åç代ç å±äºé¢å¤çï¼ä¼å¨æµè¯åæ§è¡ï¼ yield ä¹åç代ç å±äºåå¤çï¼å°å¨æµè¯å®æåæ§è¡ã
以ä¸æµè¯æ¨¡ææ°æ®åºæ¥è¯¢ï¼ä½¿ç¨åºä»¶æ¥æ¨¡ææ°æ®åºçè¿æ¥å ³éï¼
ç»æï¼
å¯ä»¥çå°å¨ä¸¤ä¸ªæµè¯ç¨ä¾æ§è¡ååé½æé¢å¤çååå¤çã
pytestä¸è¿æé常å¤çæ件ä¾æ们使ç¨ï¼æ们æ¥ä»ç»å 个常ç¨çã
å æ¥çä¸ä¸ªéè¦çï¼é£å°±æ¯çææµè¯ç¨ä¾æ¥åã
æ³è¦çææµè¯æ¥åï¼é¦å è¦æä¸è½½ï¼æè½ä½¿ç¨ã
ä¸è½½
å¦æä¸è½½å¤±è´¥ï¼å¯ä»¥ä½¿ç¨PyCharmä¸è½½ï¼æä¹ç¨PyCharmä¸è½½è¿éæ éå¤è¨äºå§ã
使ç¨
å¨é ç½®æ件ä¸ï¼æ·»å åæ°ï¼
ææå¾ä¸éå§ï¼
没å®ï¼çæ大æ
Allureæ¡æ¶æ¯ä¸ä¸ªçµæ´»çè½»é级å¤è¯è¨æµè¯æ¥åå·¥å ·ï¼å®ä¸ä» 以webçæ¹å¼å±ç¤ºäºç®æ´çæµè¯ç»æï¼èä¸å 许åä¸å¼åè¿ç¨çæ¯ä¸ªäººä»æ¥å¸¸æ§è¡çæµè¯ä¸æ大é度çæåæç¨ä¿¡æ¯ã
ä»å¼å人åï¼devï¼developerï¼åè´¨éä¿è¯äººåï¼QAï¼Quality Assuranceï¼çè§åº¦æ¥çï¼Allureæ¥åç®åäºå¸¸è§ç¼ºé·çç»è®¡ï¼å¤±è´¥çæµè¯å¯ä»¥å为bugå被ä¸æçæµè¯ï¼è¿å¯ä»¥é ç½®æ¥å¿ãæ¥éª¤ãfixtureãé件ã计æ¶ãæ§è¡ åå² ä»¥åä¸TMSåBUG管çç³»ç»éæï¼æ以ï¼éè¿ä»¥ä¸é ç½®ï¼ææè´è´£çå¼å人ååæµè¯äººåå¯ä»¥å°½å¯è½çææ¡æµè¯ä¿¡æ¯ã
ä»ç®¡çè çè§åº¦æ¥çï¼Allureæä¾äºä¸ä¸ªæ¸ æ°çâ大å¾âï¼å ¶ä¸å æ¬å·²è¦ççç¹æ§ã缺é·èéçä½ç½®ãæ§è¡æ¶é´è½´çå¤è§ä»¥å许å¤å ¶ä»æ¹ä¾¿çäºæ ãallureç模åååå¯æ©å±æ§ä¿è¯äºæ们æ»æ¯è½å¤å¯¹æäºä¸è¥¿è¿è¡å¾®è°ã
å°æ¯ç¹ï¼æ¥ççæä¹ä½¿ç¨ã
Pythonçpytestä¸allureä¸è½½
ä½ç±äºè¿ä¸ª allure-pytest æ件çæçæµè¯æ¥åä¸æ¯ html ç±»åçï¼æ们è¿éè¦ä½¿ç¨allureå·¥å ·åâå å·¥âä¸ä¸ãæ以说ï¼æ们è¿éè¦ä¸è½½è¿ä¸ªallureå·¥å ·ã
allureå·¥å ·ä¸è½½
å¨ç°å¨allureå·¥å ·ä¹åï¼å®ä¾èµJavaç¯å¢ï¼æ们è¿éè¦å é ç½®Javaç¯å¢ã
注æï¼å¦æä½ ççµèå·²ç»æäºJavaç¯å¢ï¼å°±æ ééæ°é ç½®äºã
é ç½®å®äºJavaç¯å¢ï¼æ们åæ¥ä¸è½½allureå·¥å ·ï¼æè¿éç´æ¥ç»åºäºç¾åº¦äºçé¾æ¥ï¼ä½ ä¹å¯ä»¥å»å ¶ä»é¾æ¥ä¸èªè¡ä¸è½½ï¼
ä¸è½½å¹¶è§£å好äºallureå·¥å ·å ä¹åï¼è¿éè¦å°allureå å ç bin ç®å½æ·»å å°ç³»ç»çç¯å¢åéä¸ã
å®äºåæå¼ä½ çç»ç«¯æµè¯ï¼
è¿åäºçæ¬å·è¯´æå®è£ æåã
使ç¨
ä¸è¬ä½¿ç¨allureè¦ç»åå 个æ¥éª¤ï¼
æ¥çé ç½® pytest.ini ï¼
å°±æ¯ --alluredir ./report/result åæ°ã
å¨ç»ç«¯ä¸è¾å ¥ pytest æ£å¸¸æ§è¡æµè¯ç¨ä¾å³å¯ï¼
æ§è¡å®æ¯åï¼å¨é¡¹ç®çæ ¹ç®ä¸ï¼ä¼èªå¨çæä¸ä¸ª report ç®å½ï¼è¿ä¸ªç®å½ä¸æï¼
æ¥ä¸æ¥éè¦ä½¿ç¨allureå·¥å ·æ¥çæHTMLæ¥åã
æ¤æ¶æ们å¨ç»ç«¯ï¼å¦ææ¯windowså¹³å°ï¼å°±æ¯cmdï¼ï¼è·¯å¾æ¯é¡¹ç®çæ ¹ç®å½ï¼æ§è¡ä¸é¢çå½ä»¤ã
PSï¼æå¨pycharmä¸çterminalè¾å ¥allureæ示'allure' ä¸æ¯å é¨æå¤é¨å½ä»¤ï¼ä¹ä¸æ¯å¯è¿è¡çç¨åºææ¹å¤çæ件ãä½windowsçç»ç«¯æ²¡æé®é¢ã
å½ä»¤çæææ¯ï¼æ ¹æ® reportresult ç®å½ä¸çæ°æ®ï¼è¿äºæ°æ®æ¯è¿è¡pytestå产ççï¼ãå¨ report ç®å½ä¸æ°å»ºä¸ä¸ª allure_html ç®å½ï¼èè¿ä¸ªç®å½å æ index.html ææ¯æç»çallureçæ¬çHTMLæ¥åï¼å¦æä½ æ¯éå¤æ§è¡çè¯ï¼ä½¿ç¨ --clean æ¸ é¤ä¹åçæ¥åã
ç»æå¾æ¼äº®ï¼
allure open
é»è®¤çï¼allureæ¥åéè¦HTTPæå¡å¨æ¥æå¼ï¼ä¸è¬æ们å¯ä»¥éè¿pycharmæ¥å®æï¼å¦å¤ä¸ç§æ åµå°±æ¯éè¿allureèªå¸¦çopenå½ä»¤æ¥å®æã
allureçå ¶ä»ç¨æ³
å½ç¶ï¼æ äºè¿æ¯æ²¡æå®ï¼å¨ä½¿ç¨allureçææ¥åçæ¶åï¼å¨ç¼åç¨ä¾é¶æ®µï¼è¿å¯ä»¥æä¸äºåæ°å¯ä»¥ä½¿ç¨ï¼
allure.titleä¸allure.description
featureåstory
ç±ä¸å¾å¯ä»¥çå°ï¼ä¸åçç¨ä¾è¢«å为ä¸åçåè½ä¸ã
allure.severity
allure.severity ç¨æ¥æ è¯æµè¯ç¨ä¾æè æµè¯ç±»ç级å«ï¼å为blockerï¼criticalï¼normalï¼minorï¼trivial5个级å«ã
severityçé»è®¤çº§å«æ¯normalï¼æ以ä¸é¢çç¨ä¾5å¯ä»¥ä¸æ·»å è£ é¥°å¨äºã
allure.dynamic
å¨ä¹åï¼ç¨ä¾çæ§è¡é¡ºåºæ¯ä»ä¸å°ä¸ä¾æ¬¡æ§è¡ï¼
æ£å¦ä¸ä¾çæ§è¡é¡ºåºæ¯ 3 1 2 ã
ç°å¨ï¼æ¥ççæ们å¦ä½æå¨æ§å¶å¤ä¸ªç¨ä¾çæ§è¡é¡ºåºï¼è¿éä¹ä¾èµä¸ä¸ªæ件ã
ä¸è½½
使ç¨
æå¨æ§å¶ç¨ä¾æ§è¡é¡ºåºçæ¹æ³æ¯å¨ç»åç¨ä¾æ·»å ä¸ä¸ªè£ 饰å¨ï¼
é£ä¹ï¼ ç°å¨çæ§è¡é¡ºåºæ¯ 2 1 3 ï¼æç §orderæå®çæåºæ§è¡çã
å¦ææ人è¾å²ä¼ 个0æè è´æ°å¥çï¼é£ä¹å®ä»¬çæåºå ³ç³»åºè¯¥æ¯è¿æ ·çï¼
失败éè¯æææ¯æå®æ个ç¨ä¾æ§è¡å¤±è´¥å¯ä»¥éæ°è¿è¡ã
ä¸è½½
使ç¨
éè¦å¨ pytest.ini æ件ä¸ï¼ é ç½®ï¼
ç» addopts å段æ°å¢ï¼å ¶ä»åæä¿æä¸åï¼ --reruns=3 å段ï¼è¿æ ·å¦ææç¨ä¾æ§è¡å¤±è´¥ï¼åå次æ§è¡ï¼å°è¯3次ã
æ¥ç示ä¾ï¼
ç»æï¼
æ们ä¹å¯ä»¥ä»ç¨ä¾æ¥åä¸çåºéè¯çç»æï¼
ä¸é¢æ¼ç¤ºäºç¨ä¾å¤±è´¥äºï¼ç¶åéæ°æ§è¡å¤å°æ¬¡é½æ²¡ææåï¼è¿æ¯ä¸ç§æ åµã
æ¥ä¸æ¥ï¼æ¥çå¦ä¸ç§æ åµï¼é£å°±æ¯ç¨ä¾æ§è¡å¤±è´¥ï¼éæ°æ§è¡æ¬¡æ°å éè¿äºï¼é£ä¹å©ä½çéæ°æ§è¡ç次æ°å°ä¸åæ§è¡ã
éè¿ random 模å帮å©æ们æ¼ç¤ºåºå¨æ次æ§è¡ä¸åºç°å¤±è´¥çæ åµï¼èå¨éæ°æ§è¡çæ¶åï¼ä¼åºç°æåçæ åµï¼çç»æï¼
å¯ä»¥çå°ï¼ç¨ä¾ éæ°æ§è¡äºä¸æ¬¡å°±æåäºï¼å©ä½ç两次æ§è¡å°±ç»æ¢äºã
ä¸æ¡ä¸æ¡ç¨ä¾çæ§è¡ï¼è¯å®ä¼å¾æ ¢ï¼æ¥çå¦ä½å¹¶åçæ§è¡æµè¯ç¨ä¾ï¼å½ç¶è¿éè¦ç¸åºçæ件ã
ä¸è½½
使ç¨
å¨é ç½®æ件ä¸æ·»å ï¼
å°±æ¯è¿ä¸ª -n=auto ï¼
并åçé ç½®å¯ä»¥åå¨é ç½®æ件ä¸ï¼ç¶åå ¶ä»æ£å¸¸çæ§è¡ç¨ä¾èæ¬å³å¯ãå¦å¤ä¸ç§å°±æ¯å¨ç»ç«¯ä¸æå®ï¼å æ¥ç示ä¾ï¼
ç»æï¼
pytest-sugar æ¹åäº pytest çé»è®¤å¤è§ï¼æ·»å äºä¸ä¸ªè¿åº¦æ¡ï¼å¹¶ç«å³æ¾ç¤ºå¤±è´¥çæµè¯ãå®ä¸éè¦é ç½®ï¼åªé ä¸è½½æ件å³å¯ï¼ç¨ pytest è¿è¡æµè¯ï¼æ¥äº«åæ´æ¼äº®ãæ´æç¨çè¾åºã
ä¸è½½
å ¶ä»ç §æ§æ§è¡ç¨ä¾å³å¯ã
pytest-cov å¨ pytest ä¸å¢å äºè¦ççæ¯æï¼æ¥æ¾ç¤ºåªäºä»£ç è¡å·²ç»æµè¯è¿ï¼åªäºè¿æ²¡æãå®è¿å°å æ¬é¡¹ç®çæµè¯è¦ççã
ä¸è½½
使ç¨
å¨é ç½®æ件ä¸ï¼
ä¹å°±æ¯é ç½® --cov=./scripts ï¼è¿æ ·ï¼å®å°±ä¼ç»è®¡ææ scripts ç®å½ä¸ææ符åè§åçèæ¬çæµè¯è¦ççã
æ§è¡çè¯ï¼å°±ç §å¸¸æ§è¡å°±è¡ã
ç»æï¼
æ´å¤æ件åèï¼/p/
æçæ¶åï¼å¨ pytest.ini ä¸é ç½®äº pytest-html å allure æ件ä¹åï¼æ§è¡åæ¥éï¼
åºç°äºè¿ä¸ªæ¥éï¼æ£æ¥ä½ é ç½®ç解éå¨ä¸æ¯å¦åå¨ pytest-html å allure-pytest è¿ä¸¤ä¸ªæ¨¡åãå¦ææ¯ä½¿ç¨çpycharm ideï¼é£ä¹ä½ é¤äºæ£æ¥settingsä¸ç解éå¨é ç½®ä¹å¤ï¼è¿éè¦ä¿è¯è¿è¡èæ¬çç¼è¾å¨é ç½®æ¯å¦è·settingsä¸é ç½®ä¸è´ã
xlrd实现从excel文件读取数据
在自动化测试中,数据驱动是一个关键策略,它让测试案例依赖于输入数据而非硬编码值,从而确保结果的准确性和可重复性。Python的ddt模块便是实现数据驱动测试的强大工具。在Python的数据处理中,xlrd和xlwt是不可或缺的库。xlrd主要负责读取Excel文件,而xlwt则用于创建或写入Excel文件。 要实现从Excel文件中提取测试数据,首先,你需要将测试数据,比如三组测试用例,组织并写入Excel表格。这样,数据就成为驱动测试流程的源。 使用xlrd库读取Excel文件(支持xls格式)的示例如下:打开Excel文件:使用xlrd的load_workbook函数,如`workbook = xlrd.open_workbook('test_data.xlsx')`
选择工作表:`worksheet = workbook.sheet_by_index(0)` 或 `worksheet = workbook.sheet_by_name('Sheet1')`
读取单元格数据:通过索引或名称获取单元格值,如`cell_value = worksheet.cell(row, col).value`
以上步骤演示了如何通过xlrd从Excel中获取数据,它为数据驱动的测试提供了基础支持。python单元测试框架之unittest和pytest的区别
在Python的单元测试框架中,unittest和pytest是其中的佼佼者。unittest因其基础性及二次开发的便利性而深受开发者喜爱。然而,pytest以其简洁、灵活的用例编写规则和丰富的插件集,成为了现代开发者的优选。接下来,我们将深入探讨unittest与pytest在用例编写规则、用例前置和后置、断言、六六源码网报告、失败重跑、参数化、用例分类执行等方面的区别。
### 用例编写规则
对于unittest,测试文件需导入unittest模块,测试类需继承unittest.TestCase,测试方法以“test_”开头,并在测试类中调用unittest.main()。而pytest则更加灵活,测试文件名可遵循“test_”开头或“_test”结尾,测试方法同样以“test_”开头,测试类以"Test"开头命名,提供更简洁的测试结构。
### 用例前置和后置
unittest提供setUp/tearDown方法,适用于所有用例。而pytest则支持模块级、函数级、类级、方法级的setup/teardown,提供了更精细的控制粒度,实现更加灵活的前置和后置操作。
### 断言
unittest提供了多种断言方法,如assertEqual、assertIn等。相比之下,pytest采用更简洁的assert表达式,减少了冗余代码。
### 报告
unittest通常使用HTMLTestRunnerNew库生成测试报告,而pytest则提供更多的amcap录像源码报告选项,如pytest-HTML、allure插件,支持更丰富的报告展示和分析。
### 失败重跑
unittest自身不支持失败重跑,而pytest通过pytest-rerunfailures插件实现了用例执行失败后的自动重跑。
### 参数化
对于参数化测试,unittest依赖于ddt库,而pytest则直接使用@pytest.mark.parametrize装饰器,提供了更简洁的参数化实现。
### 用例分类执行
unittest默认执行所有用例,通过加载测试套件可以实现部分用例的执行。而pytest通过在测试类和方法上使用@pytest.mark标记,配合命令行参数,可以实现更灵活的用例分类执行。
### 总结
综上所述,unittest提供了基础的测试框架,适用于对测试流程有严格控制和二次开发需求的场景。而pytest则以其简洁的语法、丰富的插件集和更灵活的测试控制,成为追求高效和快速迭代的开发者的首选。无论是从用例编写、执行效率、还是报告生成的角度看,pytest都展示了其在现代测试框架领域的优势。
Python接口自动化之yaml配置文件
在先前的Python接口自动化测试系列文章中,我们探讨了“Python接口自动化之数据驱动”,其中涉及了openpyxl操作excel并结合ddt实现数据驱动的相关内容。
在接口自动化测试过程中,配置文件的运用是不可或缺的,比如数据库信息、devexpress源码下载账号信息、域名等都需要通过配置文件来存储。
在众多配置文件类型中,yaml文件以其简洁的操作和强大的功能,成为了一种流行的选择。相较于ini或conf等配置文件,yaml文件更加简洁,且易于操作,能够存放多种类型的数据。
本文将主要介绍yaml语法的使用、yaml数据的存储方式以及如何封装类来读写yaml配置文件。
一、yaml介绍及使用
yaml简介
YAML语言的设计目标是方便人类读写,本质上是一种通用的数据串行化格式。
YAML语言非常灵活,几乎可以看作是JSON的超集。除了支持注释、换行符分隔、多行字符串、裸字符串以及更灵活的类型系统之外,YAML还支持引用文件,以避免代码重复。
yaml语法规则
基本语法规则如下:
yaml数据结构
▌对象
Map(属性和值)(键值对)的形式:
key:(空格)value:表示一对键值对,空格不可省略。
一行写法:相当于JSON格式:
▌数组
一组连词线开头的行,构成一个数组。数组前加有 “-” 符号,符号与值之间需用空格分隔。
一行写法:相当于JSON:
▌纯量
单个的、不可再分的值。(如:字符串、bool值、整数、浮点数、时间、日期、null等)
二、yaml配置文件的使用
yaml配置文件准备
在项目下新建一个目录config,在目录下新建一个文件config.yaml。
在config.yaml配置文件中写入数据库配置。
yaml配置文件格式校验
对于刚开始接触yaml的同学,可能对yaml格式的掌握不够熟练,容易出现格式错误。这里推荐一个在线网站,用于校验我们写的yaml文件格式是否正确。
在线地址:
bejson.com/validators/y...
三、yaml配置文件读写
python中读取yaml文件前需要安装pyyaml和导入yaml模块。
安装pyYaml
在python中读取yaml文件,需要用到第三方模块PyYaml。
安装命令:
pip install pyYaml
yaml模块源码解析
从yaml模块中提取出load、dump函数。
load:
将yaml流转化为python字典;
dump:
将python对象转化为yaml流;
读写yaml配置文件
将读写yaml配置文件的类进行封装。
在common目录下新建一个文件,config_handler.py用于读写yaml。
config_handler.py
运行结果为:
写入到config1.yaml的数据。
config1.yaml
总结:本文主要介绍yaml语法、yaml储存数据,封装类读取yaml配置文件。
Python热门单元测试框架对比:pytest和unittest还傻傻分不清楚?
前言
在进行自动化测试时,编写测试用例会使用到单元测试模块,其中Python中常见的单元测试模块包括unittest、pytest、nose等。其中,unittest和pytest是被提及最多的两个框架,本文将通过简单介绍,对比这两者在断言、用例执行规则、前后置操作、测试报告、参数化功能、失败重跑、跳过用例等方面的主要区别。
unittest
unittest框架是Python内置的单元测试框架,广泛应用于各种项目中。它基于JUnit框架设计,支持多种自动化测试用例编写、前置条件和后置数据清理功能。unittest能将多个测试用例组织到测试集中,生成测试报告。
pytest
pytest是基于Python的单元测试框架,是对unittest的扩展,更加简洁、方便,支持第三方插件,可以高效完成测试工作。pytest也支持unittest的代码框架内容。
区别
从以下几个方面对比unittest和pytest的主要区别:
断言
unittest采用自身携带的断言函数,如assertEqual、assertTrue、assertFalse等。而pytest使用Python内置的assert语句进行断言。
用例执行规则
unittest要求测试类继承unittest.TestCase,测试用例以test开头,执行顺序按ASCII排序,不能指定特定用例顺序。unittest提供多种方法(如TestCase、TestSuite、TestLoder、TextTestRunner)来方便测试用例编写和执行。
pytest则要求测试文件名以test_开头,类名以Test开头,测试用例同样以test_开头。执行顺序默认从上到下,可以通过第三方插件定制。执行用例无需导入模块,通过命令行即可执行。
前后置操作
unittest支持setup()和tearDown()方法控制用例前后置操作,setupclass()和teardownclass()方法控制类级别操作。pytest支持模块级别(setup_module,teardown_module)、函数级别(setup_function,teardown_function)等操作,通过fixture和装饰器灵活使用。
测试报告
unittest没有自带测试报告,需依赖第三方插件(如HTMLTestRunner、BeautifulReport)生成报告。pytest同样没有自带报告,可使用第三方插件(如pytest-html、allure-pytest)生成详细报告。
参数化功能
unittest不支持参数化,需借助第三方库(如DDt)实现。pytest支持参数化,可通过@pytest.mark.parametrize或@pytest.fixture(params)实现。
失败重跑
unittest不支持用例失败后的自动重跑机制,而pytest通过第三方插件(如pytest-rerunfailures)实现用例重跑。
跳过用例
两者都有跳过用例的功能,unittest通过skip或skipif实现,pytest通过skip或skipif实现,允许在条件满足时跳过用例。
实战演示
通过请求天气和查询身份证接口的测试用例,分别使用unittest和pytest框架进行参数化测试、跳过用例的实现,并通过生成测试报告进行对比。
总结
综上所述,unittest提供基础的单元测试功能,而pytest在unittest的基础上进行了增强和扩展,支持更多的第三方插件,使得测试编写更为灵活和高效。对于初学者,建议先学习unittest,了解其源码后,再逐步接触pytest。
Python 自动化测试框架unittest与pytest的区别,你知道多少?
Python自动化测试框架unittest与pytest的比较
unittest和pytest在测试框架中各有特点,主要区别体现在用例编写、条件管理、参数化、断言、执行流程、失败重跑和报告生成等方面: unittest的用例格式较为复杂,不兼容某些插件,但二次开发较为方便;而pytest则以简洁著称,支持unittest风格的测试,兼容性好,且拥有丰富的插件如flask插件支持失败重跑和xdist插件支持并行执行,效率更高。 在前置和后置条件管理上,unittest遵循特定的执行顺序,而pytest则提供更为灵活的fixture功能,如自定义级别和共享模式。 参数化方面,unittest通过ddt实现数据驱动测试,而pytest直接使用pytest.mark.parametrize进行多组数据的测试。 下面通过实例展示unittest和pytest在前后置条件和参数化的不同:unittest的前后置执行顺序明显,而pytest的模块级、类级和函数级前置后置更为灵活。
pytest的fixture功能允许自定义全局前置和后置操作,提高测试效率。
总的来说,pytest凭借其简洁的语法、良好的兼容性和丰富的插件,更适合现代自动化测试需求。如果你正在寻找更高效、便捷的测试框架,pytest可能是更好的选择。