精华内容
下载资源
问答
  • 内置fixtures之 tmpdir: tmpdir的作用是:在本地生成临时文件夹,并返回文件对象; 代码演示: 先写个测试用例,调用 tmpdir,执行一下看看: class TestDemoA: def test_A_001(self, tmpdir): time....

    内置 fixtures 之 tmpdir:

    tmpdir 的作用是:在本地生成临时文件夹,并返回文件对象;

    代码演示:

    先写个测试用例,调用 tmpdir,执行一下看看:

    class TestDemoA:    
        def test_A_001(self, tmpdir):
            time.sleep(2)
            print('\n',tmpdir)
    
    if __name__ == '__main__':
        pytest.main(['-s'])
    # 执行结果:
    ============================= test session starts =============================
    test_Z.py::TestDemoA::test_A_001 
     C:\Users\MyPC\AppData\Local\Temp\pytest-of-MyPC\pytest-0\test_A_0010
    PASSED
    
    ============================== 2 passed in 3.04s ==============================
    
    Process finished with exit code 0
    

    可以看到控制台有打印出生成的临时文件夹的目录,并且电脑本地也生成了文件夹!

    然后我们发现临时文件目录是有规律的,改下代码多执行几次看看:

    class TestDemoA:    
        def test_A_001(self, tmpdir):
            time.sleep(2)
            print('\n',tmpdir)
    
        def test_A_002(self, tmpdir):
            time.sleep(2)
            print('\n',tmpdir)
    
    
    if __name__ == '__main__':
        pytest.main(['-s'])
    # 执行结果:
    ============================= test session starts =============================
    test_Z.py::TestDemoA::test_A_001 
     C:\Users\MyPC\AppData\Local\Temp\pytest-of-MyPC\pytest-8\test_A_0010
    PASSED
    test_Z.py::TestDemoA::test_A_002 
     C:\Users\MyPC\AppData\Local\Temp\pytest-of-MyPC\pytest-8\test_A_0020
    PASSED
    
    ============================== 2 passed in 4.04s ==============================
    
    Process finished with exit code 0
    

    总结说明:

    通过几次执行我们可以看到,每一次完成的测试活动 tmpdir 会创建一个 pytest-x 的临时目录,并且这个临时目录最多保存3个,超过3个后会删除最老的临时目录,然后在这个测试活动中, tmpdir 每被调用1次就会在 pytest-x 下面生成1个子目录,子目录的文件名是根据测试用例的名称决定;

    tmpdir 提供的方法:

        def mkdir(self, *args):
            """ 创建并返回与给定参数拼接的目录;
            """    
    
        def samefile(self, other):
            """ 对比tmpdir的目录和给定的目录是否相同,相同返回 True,否则返回 False;
            """
    
        def remove(self, rec=1, ignore_errors=False):
            """ 删除文件或目录(如果rec=1,则删除目录树)。如果ignore_errors为真,则删除目录时的错误将被忽略;
            """
    
        def computehash(self, hashtype="md5", chunksize=524288):
            """ 返回此文件的哈希值的十六进制摘要。 """
    
        def dirpath(self, *args, **kwargs):
            """ 返回与所有给定参数拼接的目录路径;
            """
    
        def join(self, *args, **kwargs):
            """ 返回与所有给定参数拼接的目录路径; 和上面的略有区别,详见源码;
            """
    
        def open(self, mode='r', ensure=False, encoding=None):
            """ 以给定模式返回打开的文件,如果ensure为True,则在需要时创建父目录;
            """
    
        def listdir(self, fil=None, sort=None):
            """ 列出目录内容,可能由给定的过滤函数过滤并排序;
            """
    
        def size(self):
            """ 返回基础文件对象的大小;
            """
    
        def mtime(self):
            """ 返回路径的最后修改时间;
            """
    
        def copy(self, target, mode=False, stat=False):
            """ 复制路径到目标;
                如果mode为True,则复制 “文件权限” 到目标;
                如果stat为True,则复制 “权限、上次修改时间、上次访问时间”到目标;
            """
    
        def rename(self, target):
            """ 将此路径重命名为给定参数; 
            """
    
        def write_binary(self, data, ensure=False):
            """ write binary data into path.   If ensure is True create
            missing parent directories.
            """
    
        def write_text(self, data, encoding, ensure=False):
            """ write text data into path using the specified encoding.
            If ensure is True create missing parent directories.
            """
    
        def write(self, data, mode='w', ensure=False):
            """ write data into path.   If ensure is True create
            missing parent directories.
            """
    
        def ensure(self, *args, **kwargs):
            """ ensure that an args-joined path exists (by default as
                a file). if you specify a keyword argument 'dir=True'
                then the path is forced to be a directory path.
            """
    
        def stat(self, raising=True):
            """ Return an os.stat() tuple. """
    
        def lstat(self):
            """ Return an os.lstat() tuple. """
    
        def setmtime(self, mtime=None):
            """ set modification time for the given path.  if 'mtime' is None
            (the default) then the file's mtime is set to current time.
    
            Note that the resolution for 'mtime' is platform dependent.
            """
    
        def chdir(self):
            """ change directory to self and return old current directory """
    
        def realpath(self):
            """ return a new path which contains no symbolic links."""
    
        def atime(self):
            """ return last access time of the path. """
    
        def chmod(self, mode, rec=0):
            """ change permissions to the given mode. If mode is an
                integer it directly encodes the os-specific modes.
                if rec is True perform recursively.
            """
    
        def pypkgpath(self):
            """ return the Python package path by looking for the last
            directory upwards which still contains an __init__.py.
            Return None if a pkgpath can not be determined.
            """
    
        def pyimport(self, modname=None, ensuresyspath=True):
            """ return path as an imported python module.
    
            If modname is None, look for the containing package
            and construct an according module name.
            The module will be put/looked up in sys.modules.
            if ensuresyspath is True then the root dir for importing
            the file (taking __init__.py files into account) will
            be prepended to sys.path if it isn't there already.
            If ensuresyspath=="append" the root dir will be appended
            if it isn't already contained in sys.path.
            if ensuresyspath is False no modification of syspath happens.
            """
    
        def sysexec(self, *argv, **popen_opts):
            """ return stdout text from executing a system child process,
                where the 'self' path points to executable.
                The process is directly invoked and not through a system shell.
            """
    
        def sysfind(cls, name, checker=None, paths=None):
            """ return a path object found by looking at the systems
                underlying PATH specification. If the checker is not None
                it will be invoked to filter matching paths.  If a binary
                cannot be found, None is returned
                Note: This is probably not working on plain win32 systems
                but may work on cygwin.
            """
    
        def get_temproot(cls):
            """ return the system's temporary directory
                (where tempfiles are usually created in)
            """
    
        def mkdtemp(cls, rootdir=None):
            """ return a Path object pointing to a fresh new temporary directory
                (which we created ourself).
            """
    
        def make_numbered_dir(cls, prefix='session-', rootdir=None, keep=3,
                              lock_timeout = 172800):   # two days
            """ return unique directory with a number greater than the current
                maximum one.  The number is assumed to start directly after prefix.
                if keep is true directories with a number less than (maxnum-keep)
                will be removed.
            """

     

    展开全文
  • 内置fixtures之cache: cache是一个可以在测试会话之间保持状态的缓存对象; 源码展示: @pytest.fixture def cache(request): """ Return a cache object that can persist state between testing sessions....

    内置 fixtures 之 cache:

    cache 是一个可以在测试会话之间保持状态的缓存对象;

     源码展示:

    @pytest.fixture
    def cache(request):
        """
        Return a cache object that can persist state between testing sessions.
    
        cache.get(key, default)
        cache.set(key, value)
    
        Keys must be a ``/`` separated value, where the first part is usually the
        name of your plugin or application to avoid clashes with other cache users.
    
        Values can be any object handled by the json stdlib module.
        """
        return request.config.cache

    源码文档中已经说明,cache 提供了两个方法:

    1. cache.set(key, value):写入缓存;
      1. key 参数:缓存存储的路径,是相对于缓存文件 .pytest_cache/v/ 的相对路径,如无此路径会自动创建;
      2. value 参数:缓存的值;
      3. 注意:此方法写入缓存是实时写入的,测试未结束之前缓存文件未显示,但是缓存是已经被写入的;
    2. cache.get(key, default):返回给定键的缓存值,如果尚未缓存任何值或无法读取该值,则返回指定的默认值;
      1. key 参数:缓存存储的路径,也是相对于缓存文件 .pytest_cache/v/ 的相对路径;
      2. default 参数:获取不到缓存值时的默认值;

    实际应用:

    # 利用缓存统计用例执行时间
    @pytest.fixture(autouse=True)
    def my_cache(request, cache):
        # 获取当前用例名称
        nodeid = request.node.nodeid.split(':')[-1]
        # 缓存存储路径
        cache_path = f'case_time/{nodeid}'
        # 用例开始时间
        start_time = datetime.datetime.now()
        yield
        # 用例结束时间
        end_time = datetime.datetime.now()
        # 计算执行时间
        total_time = (end_time - start_time).total_seconds()
        # 写入缓存
        cache.set(cache_path, total_time)
        # 获取并打印写入缓存
        time = cache.get(cache_path, None)
        print('写入后获取时间:', time)

    执行结果:

    测试结束后可以看到缓存文件中出现写入的缓存;

    展开全文
  • #!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2020/8/31 11:29 ...from _pytest.fixtures import SubRequest def expensive_computation(): print("running expensive computation....
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    # @Time     :   2020/8/31 11:29
    # @Author    :  victor
    # @Email     :  
    import pytest
    import time
    
    from _pytest.fixtures import SubRequest
    
    
    def expensive_computation():
        print("running expensive computation...")
    
    
    @pytest.fixture
    def mydata(request):
        val = request.config.cache.get("example/value",None)  # 是相对于缓存文件 .pytest_cache/v/ 的相对路径,如无此路径会自动创建 key 按照/分割 取不到值 默认为none
        if val is None:
            expensive_computation()
            val = 42
            request.config.cache.set("example/value", 50)  # 写回缓存
            print(request.config.cache.get("example/value",None))# 程序运行结束前即可获取结果
        return val
    
    
    def test_function(mydata):
        print("123123")
    
    
    if __name__ == '__main__':
        
        pytest.main(['-s', "test_2.py"])

     

    展开全文
  • 内置fixtures: 前面说过我们可以通过自定义fixture来实现测试用例的前置和后置工作,其实pytest中也有一些内置的fixture可供我们调用; 内置fixture的作用就是为了使pytest更加强大,它可以修改控制pytest的行为,...

    内置 fixtures:

    前面说过我们可以通过自定义 fixture 来实现测试用例的前置和后置工作,其实 pytest 中也有一些内置的 fixture 可供我们调用;

    内置 fixture 的作用就是为了使 pytest 更加强大,它可以修改控制 pytest 的行为,以及为我们提供一些更加便利的功能。

    pytestconfig:

    pytestconfig 可以通过命令行参数、选项、配置文件、插件、运行目录等方式来控制pytest;

    pytestconfig 实际上就是 request.config 的快捷方式,被称为“pytest 配置对象”;

    源码展示:

    # fixtures.py
    
    @fixture(scope="session")
    def pytestconfig(request):
        """Session-scoped fixture that returns the :class:`_pytest.config.Config` object.
    
        Example::
    
            def test_foo(pytestconfig):
                if pytestconfig.getoption("verbose") > 0:
                    ...
    
        """
        return request.config

    源码中的 request 是 FixtureRequest 的实例对象,FixtureRequest 在官方的描述中是这样的:

    FixtureRequest 是来自 fixture 或者 测试用例的请求,它有访问测试上下文的权限;

    request.config 则是 FixtureRequest 中的属性:

    class FixtureRequest:
        """ A request for a fixture from a test or fixture function.
    
        A request object gives access to the requesting test context
        and has an optional ``param`` attribute in case
        the fixture is parametrized indirectly.
        """
        ...
    
        @property
        def config(self):
            """ the pytest config object associated with this request. """
            return self._pyfuncitem.config

    request.config 返回的是 `_pytest.config.Config` (pytest 配置对象):

    它可以访问配置值、插件管理器和插件挂钩;

    然后 Config 中提供的方法中,我们最长使用的就是 getoption() 和getini():

    getoption() 可以获取命令行的值;

    getini() 可以获取 pytest.ini 配置文件的参数值;

    使用 pytestconfig 获取命令行参数的值:

    方法参数:

    def getoption(self, name: str, default=notset, skip: bool = False):
        """ return command line option value.
        """
        ...

    pytestconfig 这个内置 fixture 是实际使用中最多的,用来获取命令行参数,尤其是一些必须由外部传递给 pytest 的一些自定义参数,下面是项目中的实例,目的是将设备信息传递给 pytest:

    # conftest.py
    
    import pytest
    
    # 注册自定义参数 cmdopt 到配置对象
    def pytest_addoption(parser):
        parser.addoption("--cmdopt", action="store",
                         default="None",
                         help="将自定义命令行参数 ’--cmdopt' 添加到 pytest 配置中")
    
    # 从配置对象获取 cmdopt 的值
    @pytest.fixture(scope='session')
    def cmdopt(pytestconfig):
        return pytestconfig.getoption('--cmdopt')
    
    # 然后任何 fixture 或测试用例都可以调用 cmdopt 来获得设备信息
    # main.py
    
    device_info = {'id': 'xxx', 'name': '华为', 'version': '10'}
    
    pytest.main(['-m all',
                 f'--cmdopt={device_info}'])  # 使用自定义参数传参

    使用 pytestconfig 获取 pytest.ini 配置文件中参数的值:

    # pytest.ini
    
    [pytest]
    markers =
        demo : marks tests as demo
        smoke: marks tests as smoke
        test : marks tests as test
    
    log_cli = 1
    # conftest.py
    
    @pytest.fixture(autouse=True)
    def fuc_fix(pytestconfig):
        print()
        print(pytestconfig.getini('markers'))
        print(pytestconfig.getini('log_cli'))
    # 控制台输出结果:
    ============================= test session starts =============================
    test_Z.py::TestDemoA::test_A_001 
    ['demo : marks tests as demo', 'smoke: marks tests as smoke', 'test : marks tests as test']
    True
    PASSED
    ============================== 1 passed in 0.02s ==============================

     注意:部分参数中的值会被转换为布尔值!

    展开全文
  • 文章目录Pytest fixtures: explicit, modular, scalable1. fixtures作为函数参数2. fixtures:a prime example of dependency injection3. `conftest.py` :sharing fixture functions4. Sharing test data5. Scope:...
  • Pytest fixtures:清晰 模块化 易扩展 2.0/2.3/2.4版本新函数 text fixtures的目的是为测试的重复执行提供一个可靠的固定基线。 pytest fixture比经典的xUnit setUp/tearDown方法有着显着的改进: fixtures具有明确...
  • fixtures使用模块化的方式实现,每一个fixture名字可以触发一个fixture函数,这个函数本身可以使用其他的fixtures. fixtures管理从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项参数化夹具和测试,或者...
  • 本文实例讲述了Symfony2实现在doctrine中内置数据的方法。分享给大家供大家参考,具体如下: 我们在使用symfony的时候,有时需要... "doctrine/doctrine-fixtures-bundle": "2.2.*" } } 第二步,执行composer: com
  • 、最后是内置和第三方的插件; 你还可以利用 conftest.py 文件的这个特性 为每个目录实现一个本地化的插件 ; 4. 共享测试数据 如果你想多个测试共享同样的测试数据文件,我们有两个好方法实现这个: 把...
  • Pytest内置了一些常用的fixture,可以大幅简化测试工作,例如处理临时文件,pytest内置的fixture可以识别命令行参数、在多个测试会话之间通信、校验输出流、更改环境变量等等
  • python-pytest内置fixture

    2021-03-12 23:33:29
    下面来一起看下pytest内置的fixture。 1. tmpdir和tmpdir_factory tmpdir 和 tmpdir_factory 负责在测试开始之前创建临时目录和文件,并且在结束的时候删除,也就是创建临时目录文件供测试使用,用完即...
  • Python 内置测试(调试)方法 主要介绍Python 内置原生支持的测试模块: doctest doctest 模块主要是在Python 代码中将测试参数和预期结果使用文本标记,然后会查找标注的测试块并执行,执行方式类似于交互...
  • print("test_ddd执行完毕\n") @unittest.expectedFailure def test_eee(self): self.assertEqual(2,3) if __name__=="__main__": unittest.main() 4.fixtures 除了用例的fixtures,unittest还提供了更大范围的...
  • 测试用例作为markdown文件存储在test/colorize-fixtures 。 语法测试结果存储在test/colorize-results ,该test/colorize-results从灯具自动生成。 要在VS Code中测试语法,请在VS Code调试器中选择“ Launch ...
  • 使用uDMX控制DMX的Python 3模块-具有灯具配置文件,内置效果和Web控制面板。 安装 通过pip安装(推荐) pip install -U PyDMXControl 通过具有音频支持的pip安装 pip install -U PyDMXControl[audio] 通过GitHub...
  • fixtures 测试数据:用于定义将要加载到测试数据库中的数据。好处是定义以后每次测试都会用到这些数据,而不用手动输入。 functional 功能测试:通常情况下用于测试单个控制器中的动作,并与控制器一一对应。比如...
  • No fixtures found. 此时访问http://localhost:8000/admin/,用刚才创建的用户名和密码登录,就可以看到Django内置的管理界面,其中 就有用户管理的功能。如果你对英文界面很不爽,只需要在depot/settings.py中...
  • 自动化测试框架[Cypress框架拆解]

    千次阅读 2020-12-09 03:16:53
    默认50,过大将消耗大量内存 port null Cypress占用的端口号,默认随机生成 reporter spec 在Cypress运行期间使用哪个reporter,例如Mocha内置的reporter,teamcity和junit等 reporterOptions null reporter支持的...
  • pytest使用说明

    千次阅读 2016-04-25 14:24:01
    使用和调用 python -m pytest调用: ...py.test --version 看版本py.test --fixtures 查看内置参数py.test -h | --help 命令行和配置文件帮助 失败后停止 首次失败后停止执行:py.test -x
  • Yes No 多浏览器支持 Yes Yes 测试运行 测试运行在浏览器中 测试运行在node.js中,便于设置和清除数据库fixtures Cypress和Puppeteer比较 npm i puppeteer yarn add puppeteer // 编写测试,访问helloqa站点并截图 ...
  • 传说, GitHub 上有一个 Awesome - XXX 系列的资源整理,这个系列以“全”闻名,但凡是有一定知识度的领域、语言、框架等,都有自己的 awesome-xxx 系列的项目。今天我们就介绍这个系列中的Python:awesome-python,它...
  • 输入输出的设备主要有键盘、屏幕、网卡、文件等。 7.1 键盘和屏幕 input 接收键盘的输入,得到的是字符串,name = input('your name:'),要想的到数字,需要进行类型转换 ...输出到屏幕,print(“Hello world”) ...
  • 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ClassPathResource 4.3.3. FileSystemResource 4.3.4. ServletContextResource 4.3.5. InputStreamResource 4.3.6. ...
  • py.test --fixtures # show available builtin function arguments(显示可用的内置函数参数 ) py.test -h | --help # show help on command line and config file options(显示帮助命令行和配置文件选项 ) 下节...
  • OpenStack 的单元测试

    千次阅读 2019-04-15 17:51:36
    fixtures MockPatchObject 和 MockPatch testtools testscenarios(场景) python-subunit testrepository(仓库) stestr coverage(覆盖) tox Nova 的单元测试分析(Rocky) Nova 的 tox.ini 配置 小结 Nova 单元...
  • fees-calculator-源码

    2021-04-19 08:07:16
    介绍 ... 内置了汇率API的第三方集成。 在你开始之前 设置应用程序提供的依赖项: composer install 控制台使用 php bin/console app:calculate tests/fixtures/input.csv 单元测试 php bin/phpunit

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 859
精华内容 343
关键字:

fixtures内置