如何把字典传给老师

2024-04-30 04:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我对编写测试(python)还很陌生,所以我现在有一个问题:如何将字典传递给测试函数?目前我做了以下工作:

import os
import sys
import shutil
from app.views import file_io
import pytest
from tempfile import mkdtemp
import codecs

@pytest.fixture()
def tempdir():
    tempdir = mkdtemp()
    yield tempdir
    shutil.rmtree(tempdir)

articles = [
        ["", "README.md", "# Hallo Welt", "<h1>Hallo Welt</h1>\n"],
        ["test", "article.md", "# Hallo Welt", "<h1>Hallo Welt</h1>\n"]
]


@pytest.mark.parametrize("dir, file, content_plain, content_md", articles)
def test_readRaw(tempdir, dir, file, content_plain, content_md):
    dest_path=os.path.join(tempdir, dir)
    os.makedirs(dest_path, exist_ok=True)

    with codecs.open(os.path.join(dest_path, file), 'w', 'utf-8') as fh:
        fh.write(content_plain)

    assert file_io.readRaw(os.path.join(dest_path, file)) == content_plain

我的想法/希望是我可以修改代码,这样我就可以做如下事情:

articles = [
               { "dir": "",
                 "filename": "README.md",
                 "content_md": "# Hello World",
                 "content_html": "<h1>Hello World</h1>\n" },
               { "dir": "test",
                 "filename": "article.md",
                 "content_md": "# Hallo Welt",
                 "content_html": "<h1>Hallo Welt</h1>\n"}

]


@pytest.mark.parametrize(**articles, articles)
def test_readRaw(tempdir, **articles):
    with codecs.open(os.path.join(dir, file), 'w', 'utf-8') as fh:
        fh.write(content_md)

    assert file_io.readRaw(os.path.join(dir, file)) == content_md

特别是我想避免提及所有键,这样我可以扩展字典,如果我错过了一些东西,而不修改所有测试。你知道吗

也许这是一个愚蠢的问题,但正如我所说,我刚刚开始这个话题,所以我会非常感谢每一个提示我如何可以做到这一点(或什么是更好的方式)。 致以最诚挚的问候 丹


Tags: pathtestimportpytestosdircontenth1
1条回答
网友
1楼 · 发布于 2024-04-30 04:27:44

与其尝试splat/unsplat,不如尝试将article作为参数:

@pytest.mark.parametrize('article', articles)
def test_readRaw(tempdir, article):
    # use `article['foo']` here...

另一个选择(利用python3.6+特性)是手动展开键,尽管您必须注意以相同的顺序定义每个字典

@pytest.mark.parametrize(tuple(articles[0]), [tuple(dct.values()) for dct in articles])
def test_readRaw(tempdir, dir, file, content_plain, content_md):
    ...

不管它值多少钱,我认为采用第二种方法会牺牲一些可读性(并使测试特别脆弱)


~相关建议

  • 您可以使用内置的^{} / ^{} fixtures而不是构建自己的
  • 测试中的函数实际上并不依赖于dirfile,最好不要参数化这些函数

考虑到这两个因素,使用经典参数化(一个简单的输入/输出表)测试变得简单得多:

@pytest.mark.parametrize(
    ('content_plain', 'content_md'),
    (
        ("# Hallo Welt", "<h1>Hallo Welt</h1>\n"),
        ("# ohai", "<h1>ohai</h1>\n"),
    ),
)
def test_readRaw(tmpdir, content_plain, content_md):
    f = tmpdir.join('f')
    f.write(content_plain)
    assert file_io.readRaw(f) == content_md

免责声明:我是pytest当前的核心开发者之一

相关问题 更多 >