关于pytest:pytest学习和使用4pytest和Unittest中setupteardown等方法详解和使用最全

1 Unittest两种前置和两种后置办法应用Unittest框架联合selenium做webUI自动化测试的时候,常常会遇到什么时候关上和敞开浏览器,这个时候就应用到了Unittest两种前置和两种后置办法;那具体这四种办法是什么呢?看下表:办法阐明setup()每执行一个用例之前执行一次,比方每次运行某个用例前,关上一次浏览器teardown()每执行一个用例之后执行一次,比方每次运行某个用例后,敞开一次浏览器setupClass()每执行一个用例集之前执行一次,比方每运行一个testcase前,关上一次浏览器teardownClass()每执行一个用例集之后执行一次,比方每运行一个testcase后,敞开一次浏览器而setupClass()和teardownClass() 办法用配合@classmethod办法应用。1.1 Unittest:setup、teardown办法举例创立一个脚本test_unittest_setup_teardown.py,写入以下代码:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 9:25# 文件名称:test_unittest_setup_teardown.py# 作用:验证unittest的setup、teardown办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport unittestclass TestOne(unittest.TestCase): def setUp(self) -> None: print("每运行一个case前,关上一次浏览器") def tearDown(self) -> None: print("每运行一个case后,敞开一次浏览器") def test_one(self): print("运行第一个用例") def test_two(self): print("运行第二个用例")if __name__ == "__main__": unittest.main()运行后如下:Ran 2 tests in 0.003sOKLaunching unittests with arguments python -m unittest F:/pytest_study/test_case/test_b/test_unittest_setup_teardown.py in F:\pytest_study\test_case\test_b过程已完结,退出代码 0每运行一个case前,关上一次浏览器运行第一个用例每运行一个case后,敞开一次浏览器每运行一个case前,关上一次浏览器运行第二个用例每运行一个case后,敞开一次浏览器1.2 Unittest:setupClass、teardownClass办法举例创立一个脚本test_unittest_setupclass_teardownclass.py,写入以下代码:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 9:50# 文件名称:test_unittest_setupclass_teardownclass.py# 作用:验证unittest的setupclass、teardownclass办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport unittestclass TestTwo(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("每运行一个用例集前,关上浏览器,即这个类只关上一次浏览器") @classmethod def tearDownClass(cls) -> None: print("每运行一个用例集后,敞开浏览器,即这个类只敞开一次浏览器") def test_one(self): print("运行第一个用例") def test_two(self): print("运行第二个用例")if __name__ == "__main__": unittest.main()运行后如下:Ran 2 tests in 0.002sOK每运行一个用例集前,关上浏览器,即这个类只关上一次浏览器运行第一个用例运行第二个用例每运行一个用例集后,敞开浏览器,即这个类只敞开一次浏览器过程已完结,退出代码 0留神这两个办法须要应用@classmethod润饰办法,如果不加的话会报错。2 Pytest十种前置和后置办法和unittest相似,然而办法更多,达到了十种,具体看下表:办法运行级别阐明setup_module()模块级别整个.py模块开始前只执行一次,如关上一次浏览器teardown_module()模块级别整个.py模块完结后只执行一次,如敞开一次浏览器setup_function()函数级别每个函数级别用例开始前都执行,此办法不在类中teardown_function()函数级别每个函数级别用例完结后都执行,此办法不在类中setup_class()类级别整个测试类开始前只执行一次,和Unittest根本一样teardown_class()类级别整个测试类完结后只执行一次,和Unittest根本一样setup_method()办法级别类外面每个用例执行前都会执行teardown_method()办法级别类外面每个用例完结后都会执行setup()办法细化级别类外面每个用例执行前都会执行teardown()办法细化级别类外面每个用例完结后都会执行2.1 Pytest:setup_module、teardown_module办法举例创立test_pytest_setup_teardown_module.py,代码如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 10:18# 文件名称:test_pytest_setup_teardown_module.py# 作用:验证pytest的setup_module和teardown_module办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestdef setup_module(): print("整个.py模块开始前只执行一次")def teardown_module(): print("整个.py模块完结后只执行一次")def test_one(): print("用例1")def test_two(): print("用例2")class TestOne(): # @staticmethod # def setup_module(): # print("整个.py模块开始前只执行一次") # # @staticmethod # def teardown_module(): # print("整个.py模块完结后只执行一次") def test_thr(self): print("用例3") def test_fo(self): print("用例4")if __name__ == "__main__": pytest.main()运行后果:(venv) F:\pytest_study\test_case\test_c>pytest -s -q整个.py模块开始前只执行一次用例1.用例2.用例3.用例4.整个.py模块完结后只执行一次4 passed in 0.02s把这两个办法写入类中呢,那须要应用@staticmethod办法润饰,不然语法就不对,然而写入类中的话,这两个办法应该是不会运行的。2.2 Pytest:setup_function、teardown_function办法举例创立test_pytest_setup_teardown_function.py,代码如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 10:41# 文件名称:test_pytest_setup_teardown_function.py# 作用:验证pytest的setup_function、teardown_function办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestdef setup_module(): print("整个.py模块开始前只执行一次")def teardown_module(): print("整个.py模块完结后只执行一次")def setup_function(): print("每个函数级别用例开始前都执行")def teardown_function(): print("每个函数级别用例完结后都执行")def test_one(): print("用例1")def test_two(): print("用例2")class TestOne(): def test_thr(self): print("用例3") def test_fo(self): print("用例4")if __name__ == "__main__": pytest.main()运行如下:(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown_function.py整个.py模块开始前只执行一次每个函数级别用例开始前都执行用例1.每个函数级别用例完结后都执行每个函数级别用例开始前都执行用例2.每个函数级别用例完结后都执行用例3.用例4.整个.py模块完结后只执行一次4 passed in 0.42s同样把这两个办法写入类中呢,那须要应用@staticmethod办法润饰,不然语法就不对,然而写入类中的话,这两个办法应该是不会运行的。2.3 Pytest:setup_class、teardown_class办法举例创立test_setup_teardoen_class.py代码如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 11:28# 文件名称:test_pytest_setup_teardoen_class.py# 作用:xxx# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestdef setup_module(): print("整个.py模块开始前只执行一次")def teardown_module(): print("整个.py模块完结后只执行一次")def test_one(): print("用例1")def test_two(): print("用例2")class TestOne(): def setup_class(self): print("整个测试类开始前只执行一次") def teardown_class(self): print("整个测试类完结后只执行一次") def test_thr(self): print("用例3") def test_fo(self): print("用例4")if __name__ == "__main__": pytest.main()运行后果为:(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_setup_teardoen_class.py整个.py模块开始前只执行一次用例1.用例2.整个测试类开始前只执行一次用例3.用例4.整个测试类完结后只执行一次整个.py模块完结后只执行一次4 passed in 0.02s2.4 Pytest:setup_method、teardown_method办法举例创立test_pytest_setup_teardown_method.py,代码如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 12:28# 文件名称:test_pytest_setup_teardown_method.py# 作用:验证pytest的setup_method、teardown_method办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestdef setup_module(): print("整个.py模块开始前只执行一次")def teardown_module(): print("整个.py模块完结后只执行一次")def test_one(): print("用例1")def test_two(): print("用例2")class TestOne(): def setup_class(self): print("整个测试类开始前只执行一次") def teardown_class(self): print("整个测试类完结后只执行一次") def setup_method(self): print("1类外面每个用例执行前都会执行") def teardown_method(self): print("1类外面每个用例完结后都会执行") def test_thr(self): print("用例3") def test_fo(self): print("用例4")if __name__ == "__main__": pytest.main()运行后果为:(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown_method.py整个.py模块开始前只执行一次用例1.用例2.整个测试类开始前只执行一次1类外面每个用例执行前都会执行用例3.1类外面每个用例完结后都会执行1类外面每个用例执行前都会执行用例4.1类外面每个用例完结后都会执行整个测试类完结后只执行一次整个.py模块完结后只执行一次4 passed in 0.14s2.5 Pytest:setup、teardown办法举例创立test_pytest_setup_teardown.py,代码如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 12:28# 文件名称:test_pytest_setup_teardown.py# 作用:验证pytest的setup、teardown办法# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestdef setup_module(): print("setup_module:整个.py模块开始前只执行一次")def teardown_module(): print("teardown_module:整个.py模块完结后只执行一次")def setup_function(): print("setup_function:每个函数级别用例开始前都执行")def teardown_function(): print("teardown_function:每个函数级别用例完结后都执行")def test_one(): print("用例1")def test_two(): print("用例2")class TestOne(): def setup_class(self): print("setup_class:整个测试类开始前只执行一次") def teardown_class(self): print("teardown_class:整个测试类完结后只执行一次") def setup_method(self): print("setup_method:类外面每个用例执行前都会执行") def teardown_method(self): print("teardown_method:类外面每个用例完结后都会执行") def setup(self): print("setup:类外面每个用例执行前都会执行") def teardown(self): print("teardown:类外面每个用例完结后都会执行") def test_thr(self): print("用例3") def test_fo(self): print("用例4")if __name__ == "__main__": pytest.main()运行后果如下:(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown.pysetup_module:整个.py模块开始前只执行一次setup_function:每个函数级别用例开始前都执行用例1.teardown_function:每个函数级别用例完结后都执行setup_function:每个函数级别用例开始前都执行用例2.teardown_function:每个函数级别用例完结后都执行setup_class:整个测试类开始前只执行一次setup_method:类外面每个用例执行前都会执行setup:类外面每个用例执行前都会执行用例3.teardown:类外面每个用例完结后都会执行teardown_method:类外面每个用例完结后都会执行setup_method:类外面每个用例执行前都会执行setup:类外面每个用例执行前都会执行用例4.teardown:类外面每个用例完结后都会执行teardown_method:类外面每个用例完结后都会执行teardown_class:整个测试类完结后只执行一次teardown_module:整个.py模块完结后只执行一次4 passed in 0.14s

January 16, 2023 · 2 min · jiezi

关于pytest:pytest学习和使用3对比unittest和pytest脚本在pycharm中运行的方式

一句话来说下,unittest和pytest脚本在pycharm中应用根本是一样的。根本是两种: 第一种:间接运行脚本【运行】-【Run】,抉择须要运行的脚本即可 第二种:抉择运行框架【文件】-【设置】-【Python Integrated Tools】-【Default test runner】,抉择默认的运行框架即可:比方抉择pytest,鼠标放在类或test结尾的办法上,并右键,“运行(U)pytest in xx.py”的字样 写一个unittest框架的脚本,在test_a下新建一个脚本test_u.py,脚本如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/3 17:13# 文件名称:test_u.py# 作用:xxx# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport unittestclass TestU(unittest.TestCase): def test_one(self): money = 1000000 if money > 10000: print(f"你曾经领有了{money}块钱,曾经很富裕了!")if __name__ == "__main__": unittest.main()咱们先在if __name__ == "__main__":上右键,以pytest运行,发现是能够运行的,如下:test_u.py::TestU::test_one PASSED [100%]你曾经领有了1000000块钱,曾经很富裕了!============================== 1 passed in 0.02s ==============================阐明,pytest是兼容unittest的框架的,此时咱们把运行默认框架改为unittest,再次运行,发现显示的是“运行(U)unittests in xx.py”的字样

January 16, 2023 · 1 min · jiezi

关于pytest:pytest学习和使用2初步使用和用例运行

1 测试脚本在pytest_study文件夹下创立一个test_mm.py# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/8/27 16:51# 文件名称:test_mm.py# 作用:xxx# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsondef m_sum(x): return x * (x+1)def test_m_sum(): assert m_sum(3) == 11在pytest_study文件夹下关上cmd间接输出pytest运行:(venv) F:\pytest_study>pytest========================================================================= test session starts ==========================================================================platform win32 -- Python 3.7.0, pytest-6.2.4, py-1.10.0, pluggy-0.13.1rootdir: F:\pytest_studyplugins: allure-pytest-2.8.12, cov-2.8.1, forked-1.1.3, html-2.0.1, metadata-1.8.0, ordering-0.6, xdist-1.31.0collected 1 itemtest_mm.py F [100%]=============================================================================== FAILURES ===============================================================================______________________________________________________________________________ test_m_sum ______________________________________________________________________________ def test_m_sum():> assert m_sum(3) == 11E assert 12 == 11E + where 12 = m_sum(3)test_mm.py:13: AssertionError======================================================================= short test summary info ========================================================================FAILED test_mm.py::test_m_sum - assert 12 == 11========================================================================== 1 failed in 0.07s ===========================================================================发现执行失败了,是因为12不等于11,assert是用来进行断言的。2 脚本剖析2.1 断言应用assert从上边脚本看到断言的话应用assert即可,依据官网的说法是pytest断言根本都是用的assert;2.2 应用pytest运行用例规定文件名规定:test_*.py和*_test.py命名的函数函数名规定:以test_结尾的函数类的规定test_结尾的办法,不能有__init__ 办法python包的规定同python一样,包须要有__init__.py文件以-q或-quiet参数进行静默运行函数(说白了就是后果输入简单化)3 练习下用例运行规定先在pytest_study目录下再新建一个test_case包; 而后把之前写的第一个用例test_mm.py挪动到这个目录下: 在pytest_study下执行pytest,发现是能够执行的,阐明是执行了test_case下的test_mm.py(venv) F:\pytest_study>pytest========================================================================= test session starts ==========================================================================platform win32 -- Python 3.7.0, pytest-6.2.4, py-1.10.0, pluggy-0.13.1rootdir: F:\pytest_studyplugins: allure-pytest-2.8.12, cov-2.8.1, forked-1.1.3, html-2.0.1, metadata-1.8.0, ordering-0.6, xdist-1.31.0collected 1 itemtest_case\test_mm.py F [100%]=============================================================================== FAILURES ===============================================================================______________________________________________________________________________ test_m_sum ______________________________________________________________________________ def test_m_sum():> assert m_sum(3) == 11E assert 12 == 11E + where 12 = m_sum(3)test_case\test_mm.py:13: AssertionError======================================================================= short test summary info ========================================================================FAILED test_case/test_mm.py::test_m_sum - assert 12 == 11========================================================================== 1 failed in 0.13s ===========================================================================(venv) F:\pytest_study>应用-q参数来执行下,一下子少了很多输入:(venv) F:\pytest_study>pytest -qF [100%]=============================================================================== FAILURES ===============================================================================______________________________________________________________________________ test_m_sum ______________________________________________________________________________ def test_m_sum():> assert m_sum(3) == 11E assert 12 == 11E + where 12 = m_sum(3)test_case\test_mm.py:13: AssertionError======================================================================= short test summary info ========================================================================FAILED test_case/test_mm.py::test_m_sum - assert 12 == 111 failed in 0.05s(venv) F:\pytest_study>再在test_case下新建一个名为test_a的包,并在包里复制一个test_mm1.py 从执行后果看是ok的,那么以上都证实了文件名、包名都须要以test结尾能力被执行;(venv) F:\pytest_study>pytest -qFF [100%]=============================================================================== FAILURES ===============================================================================______________________________________________________________________________ test_m_sum ______________________________________________________________________________ def test_m_sum():> assert m_sum(3) == 11E assert 12 == 11E + where 12 = m_sum(3)test_case\test_mm.py:13: AssertionError______________________________________________________________________________ test_m_sum ______________________________________________________________________________ def test_m_sum():> assert m_sum(3) == 11E assert 12 == 11E + where 12 = m_sum(3)test_case\test_a\test_mm1.py:13: AssertionError======================================================================= short test summary info ========================================================================FAILED test_case/test_mm.py::test_m_sum - assert 12 == 11FAILED test_case/test_a/test_mm1.py::test_m_sum - assert 12 == 112 failed in 0.20s(venv) F:\pytest_study>咱们批改下test_mm1.py减少一个类,如下:# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/8/27 16:51# 文件名称:test_mm.py# 作用:xxx# 分割:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelsonimport pytestclass TestClass: def test_you(self): y = "you" assert "y" in y def test_hai(self): h = "hai" assert "gg" not in hif __name__ == '__main__': pytest.main()间接在pytest_study下执行pytest -q,如下,阐明类也执行到了:(venv) F:\pytest_study>pytest -q... [100%]3 passed in 0.15s

January 16, 2023 · 2 min · jiezi

关于pytest:pytest学习和使用1pytest安装和版本查看

1 学习起源https://docs.pytest.org/en/latest/index.html 2 依赖的环境环境版本python>=3.6平台反对linux、windows3 本文学习环境Python:3.7.0 操作系统:windows10,64位 Pycharm:2020.24 pytest装置关上cmd命令行,间接输出:pip install -U pytest装置如下:C:\Users\Administrator>pip install -U pytestLooking in indexes: https://pypi.tuna.tsinghua.edu.cn/simpleRequirement already satisfied: pytest in d:\python37\lib\site-packages (5.3.2)Collecting pytest Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a1/59/6821e900592fbe261f19d67e4def0cb27e52ef8ed16d9922c144961cc1ee/pytest-6.2.4-py3-none-any.whl (280 kB) |████████████████████████████████| 280 kB 1.6 MB/sRequirement already satisfied: importlib-metadata>=0.12 in d:\python37\lib\site-packages (from pytest) (2.1.1)Requirement already satisfied: pluggy<1.0.0a1,>=0.12 in d:\python37\lib\site-packages (from pytest) (0.13.1)Requirement already satisfied: colorama in d:\python37\lib\site-packages (from pytest) (0.4.4)Requirement already satisfied: atomicwrites>=1.0 in d:\python37\lib\site-packages (from pytest) (1.4.0)Requirement already satisfied: toml in d:\python37\lib\site-packages (from pytest) (0.10.2)Requirement already satisfied: packaging in d:\python37\lib\site-packages (from pytest) (20.8)Requirement already satisfied: attrs>=19.2.0 in d:\python37\lib\site-packages (from pytest) (20.3.0)Requirement already satisfied: iniconfig in d:\python37\lib\site-packages (from pytest) (1.1.1)Requirement already satisfied: py>=1.8.2 in d:\python37\lib\site-packages (from pytest) (1.10.0)Requirement already satisfied: zipp>=0.5 in d:\python37\lib\site-packages (from importlib-metadata>=0.12->pytest) (1.2.0)Requirement already satisfied: pyparsing>=2.0.2 in d:\python37\lib\site-packages (from packaging->pytest) (2.4.7)Installing collected packages: pytest Attempting uninstall: pytest Found existing installation: pytest 5.3.2 Uninstalling pytest-5.3.2: Successfully uninstalled pytest-5.3.2Successfully installed pytest-6.2.45 查看pytest版本应用pip show命令pip show pytest(venv) F:\pytest_study>pip show pytestName: pytestVersion: 6.2.4Summary: pytest: simple powerful testing with PythonHome-page: https://docs.pytest.org/en/latest/Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and othersAuthor-email:License: MITLocation: d:\python37\lib\site-packagesRequires: pluggy, importlib-metadata, attrs, iniconfig, toml, py, packaging, atomicwrites, coloramaRequired-by: pytest-xdist, pytest-rerunfailures, pytest-ordering, pytest-metadata, pytest-html, pytest-forked, pytest-cov, allure-pytest应用--version命令,如果报错提醒如下: plugin = ep.load() File "d:\python37\lib\site-packages\importlib_metadata\__init__.py", line 105, in load module = import_module(match.group('module')) File "d:\python37\lib\importlib\__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "d:\python37\lib\site-packages\_pytest\assertion\rewrite.py", line 170, in exec_module exec(co, module.__dict__) File "d:\python37\lib\site-packages\pytest_rerunfailures.py", line 8, in <module> from _pytest.resultlog import ResultLogModuleNotFoundError: No module named '_pytest.resultlog'是因为之前装置过pytest-rerunfailures是用例失败重跑,pytest-rerunfailures不能与pytest 6.1.0以上的版本一起应用,所以卸载pytest-rerunfailures后应用pytest-reportlog来代替即可;# 卸载pytest-rerunfailurespip uninstall pytest-rerunfailures# 装置pytest-reportlogpip install pytest-reportlog再次查看pytest版本OK了(venv) F:\pytest_study>pytest -Vpytest 6.2.4

January 16, 2023 · 2 min · jiezi

关于pytest:Selenium3PytestAllure落地Python-Web自动化测试内置文档

download:Selenium3+Pytest+Allure落地Python Web自动化测试内置文档哈希表查找哈希算法的定义与实现1哈希表查找定义哈希技术是在记录的存储地位和它的关键字之间建设一个确定的对应关系,使每个关键字对应一个存储地位。 存储地位=f(关键字) 对应关系称为哈希函数,也称为哈希函数。 哈希技术用于将记录存储在一个间断的存储空间中,称为哈希表或哈希表。哈希技术不仅是一种存储办法,也是一种搜寻办法。 Hash函数可能将两个或多个不同的关键字映射到同一个地址,称这些状况为抵触,而这些抵触的不同关键字称为同义词。 2哈希函数的构造方法3.1间接寻址办法对于关键字age,能够间接用age的数量作为地址,其中f(key)=key。 如果要统计1980年当前出世年份的人口,如下图所示,能够用年份减去1980作为出世年份关键字的地址。此时f(key)=key-1980。 间接关键字去除的线性函数值是哈希地址,哈希函数是: 间接寻址法的哈希函数简略、对立且不会引起抵触,但须要当时晓得关键字的散布,所以实用于小而间断的查找表。 3.2除法和余数法除余数法是结构哈希函数最罕用的办法。假如哈希表长度为M,取一个不大于M但最靠近或等于M的素数P,哈希函数为: 假如咱们有12个记录的关键字来结构哈希表,例如,咱们应用新办法,所以它存储在下标5处。 依据教训,如果哈希表长度为M,通常P是小于等于表长度的最小素数(最好靠近M)或者是不蕴含少于20个素数因子的合数。 解决哈希抵触的3种办法3.1凋谢地址办法3.1.1线性检测办法开放式寻址办法是一旦有抵触就寻找下一个空的散列地址。只有哈希表足够大,总是能够找到空的哈希地址,并且记录将被存储。 在一个简略的例子中,咱们的关键字集是,表长度是12。咱们应用散列函数。 计算前五个数时,都是哈希地址,没有抵触,间接存储。 计算key=37时,发现与25的地位抵触,于是从新计算,37存储在下标2的地位,如图。 当key=48时,咱们计算出和12所在的地位0抵触。持续算,和25的地位抵触,所以始终到都没有空缺,如图。 这种解决抵触的开放式寻址办法称为线性检测办法。 二次检测那时候叫二次检测法。减少正方形操作的目标是为了避免所有关键词都汇集在某个区域。 伪随机检测在有抵触的状况下,用随机函数计算位移,称为随机检测法。 3.2链接地址办法为了防止非同义词的抵触,所有的同义词都存储在一个线性链表中。 对于可能导致许多抵触的散列函数,链办法提供了不会找到地址的保障。 4哈希表的搜寻哈希查找依赖于三个因素:哈希函数、解决抵触的办法和填充因子。 填充因子表中记录的哈希表长度。 哈希表的均匀搜寻长度取决于哈希表的填充因子,而不是间接取决于或。 越大越满,抵触的可能性越大。 4.1哈希表搜索算法的实现哈希表的构造定义如下: 定义胜利1定义不胜利0define HASHSIZE 12 /将哈希表长度定义为数组的长度/定义NULLKEY -32768typedef int状态;/ Status是函数的类型,其值是函数后果状态码,如OK等。/ typedef构造{int elem/数据元素存储基址,动态分配数组*/int计数;/以后数据元素的数量/}哈希表; int m = 0;/哈希表长度,全局变量/哈希表初始化: /初始化哈希表/状态InitHashTable(HashTable *H){int I;m = HASHSIZEh-> count = m;h-> elem =(int )malloc(m sizeof(int));for(I = 0;我h-> elem[I]= null key;退货OK;}作为哈希函数的余数办法: /哈希函数/int Hash(int key){返回键% m;/除法和余数法/}哈希表插入算法: /将关键字插入哈希表/void InsertHash(HashTable *H,int key){int addr = Hash(key);/查找哈希地址/while (H->elem[addr]!= NULLKEY) /如果不为空,则抵触/{addr =(addr+1)% m;/凋谢寻址办法的线性检测/}h-> elem[addr]= key;/插入关键字,直到有空格为止/}在代码中插入关键字时,首先计算哈希地址。如果以后地址不是空关键字,则示意存在抵触。此时咱们应用线性检测的凋谢寻址办法进行重寻址,这里也能够改为链地址法等其余抵触解决办法。 ...

September 23, 2022 · 1 min · jiezi

关于pytest:Pytest常用插件

本文首发于:行者AIPytest是Python的一种单元测试框架,与unittest相比,应用起来更简洁、效率更高,也是目前大部分应用python编写测试用例的小伙伴们的第一抉择了。 除了框架自身提供的性能外,Pytest还反对上百种第三方插件,良好的扩展性能够更好的满足大家在用例设计时的不同需要。本文将为大家具体介绍上面5项罕用的插件。 1. 用例依赖编写用例的时候,咱们会留神用例之间的独立性,但局部用例之间的确存在关联,无奈做到彻底独立,那么咱们就能够通过应用插件pytest-dependency设置用例之间的依赖关系。当用例A依赖于用例B时,若用例B执行失败,则用例A将会主动跳过不执行。如此,就能够防止去执行一个必定会失败的用例,相当于pytest.mark.skip。 (1)装置: pip install pytest-dependency(2)应用阐明: 首先,在标记被依赖用例时,须要在被依赖的用例上增加装璜器pytest.mark.dependency(),且被依赖用例须要在关联用例前执行。也能够给被依赖用例设置别名,通过增加参数name实现。 在关联的依赖用例上,同样须要增加装璜器pytest.mark.dependency(depends=['用例名称']),与之前不同的是,装璜器必须要填写depends参数实现用例的关联,关联的被依赖用例存在多个时能够应用“,”隔开。 此外,还能够通过scope参数指定用例依赖的范畴,同样是session、package、module、class这四种类型,此处不具体开展。 具体通过下方的示例以及执行后果来进一步阐明。 (3)示例及执行后果剖析 示例: import pytestclass TestCase: # 通过装璜器@pytest.mark.dependency()标记以后用例为被依赖用例,被依赖用例须要优先关联用例执行 @pytest.mark.dependency() def test_01(self): print("测试用例01,执行失败") assert 1 == 2 # 通过应用装璜器关联被依赖用例,通过depends参数指定用例名称关联用例 @pytest.mark.dependency(depends=['test_01']) def test_02(self): print("测试用例02,跳过") # 标记被依赖用例时,能够通过name参数指定别名 @pytest.mark.dependency(name="func_2") def test_03(self): print("测试用例03,执行胜利!") # 应用depends参数指定定义的别名关联用例 @pytest.mark.dependency(depends=['func_2']) def test_04(self): print("测试用例04,执行胜利!") # depends参数能够关联多个测试用例,应用“,”分隔即可 @pytest.mark.dependency(depends=['test_01', 'func_2']) def test_05(self): print("测试用例05,跳过")if __name__ == '__main__': pytest.main(['-vs'])执行后果如下: 咱们能够看出,只有依赖用例执行胜利时,以后用例才会被执行,否则会被跳过。依赖多个用例时,只有全副胜利,才会执行,否则一样会跳过。 2. 失败重跑有些状况下,用例在执行过程中可能会受到一些客观因素的影响,导致用例执行失败,通过应用pytest-rerunfailures插件,能够在失败后从新执行用例,并设置从新运行的最大次数。以此保障用例执行后果的准确性。 (1)装置: pip install pytest-rerunfailures(2)应用阐明: 失败重跑共有两种应用形式,别离是通过装璜器执行和命令行执行。 应用装璜器时,须要在用例上增加装璜器pytest.mark.flaky(reruns=从新执行最大次数, reruns_delay=执行间隔时间(单位:秒)),在执行过程中,增加了装璜器的用例在执行失败后会依照设置的次数和工夫从新执行。 通过在命令行执行时,同样须要指定"rerun"和"rerun-delay"两个参数来实现,如:pytest --reruns 从新执行最大次数 --reruns-delay 间隔时间。 ...

July 14, 2021 · 2 min · jiezi