我在编写测试(针对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
Run Code Online (Sandbox Code Playgroud)
我的想法/希望是我可以修改代码,这样我就可以做类似的事情:
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
Run Code Online (Sandbox Code Playgroud)
特别是我想避免提及所有键,这样如果我错过了某些内容而无需修改所有测试,我可以扩展字典。
也许这是一个愚蠢的问题,但正如我所说,我刚刚开始讨论这个主题,所以我非常感谢每一个提示我该如何做到这一点(或者什么是更好的方法)。最好的问候丹
Ant*_*ile 12
不要尝试 splat / unsplat,而是尝试将其article作为参数:
@pytest.mark.parametrize('article', articles)
def test_readRaw(tempdir, article):
# use `article['foo']` here...
Run Code Online (Sandbox Code Playgroud)
另一种选择(利用 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):
...
Run Code Online (Sandbox Code Playgroud)
就其价值而言,我认为采用第二种方法会牺牲一些可读性(并使测试特别脆弱)
~相关建议
tmp_path/tmpdir固定装置而不是构建自己的diror file,你最好不要参数化这些考虑到这两点,使用经典参数化(简单的输入/输出表)进行测试变得更加简单:
@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
Run Code Online (Sandbox Code Playgroud)
免责声明:我是当前的核心开发人员之一pytest
| 归档时间: |
|
| 查看次数: |
11272 次 |
| 最近记录: |