我有这门课:
接受.py
class AcceptC(object):
def __init__(self):
self.minimum = 30
self.maximum = 40
Run Code Online (Sandbox Code Playgroud)
和单元测试:
accept_test.py
import unittest
import pytest
from app.accept import AcceptC
class TestAcceptC(unittest.TestCase):
def setUp(self):
self.accept = AcceptC()
@pytest.mark.parametrize(
"minimum, maximum, expected_min, expected_max", [
("13", "5", 30, 40),
("30", "40", 30, 40),
])
def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max):
expected_min = self.accept.minimum
expected_max = self.accept.maximum
self.assertEqual(minimum, expected_min)
self.assertEqual(maximum, expected_max)
if __name__ == "__main__":
unittest.main()
Run Code Online (Sandbox Code Playgroud)
使用 pytest 运行时,出现错误:
NameError: 名称 'self' 未定义
我还看到我不能self在测试函数中用作参数。
最后,有没有办法避免使用:
expected_min = self.accept.minimum
expected_max = self.accept.maximum
Run Code Online (Sandbox Code Playgroud)
并立即使用self.accept.minimum?
如果我self用作测试函数的参数,它将返回:
未找到固定装置“自我”
小智 7
问题很简单,因为:
class TestAcceptC(unittest.TestCase):
Run Code Online (Sandbox Code Playgroud)
unittest.TestCase 的这种继承将打破关于 pytest 固定装置的“自我”。
信息:https : //docs.pytest.org/en/3.0.1/unittest.html
您的方法中缺少self(假设它是一个方法,如果它是一个函数,则需要将其设为TestAcceptC第一个方法)参数列表:
def test_init_returns_correct_results(minimum, maximum, expected_min, expected_max):
Run Code Online (Sandbox Code Playgroud)
应该是(我做了一些额外的改变;远离unittest并且pytest更像):
class TestAcceptC(): # no need to subclass unittest
@classmethod
def setup_class(cls):
# Called when setting up the class
cls.accept = AcceptC()
@pytest.mark.parametrize(
["minimum", "maximum", "expected_min", "expected_max"], [
("13", "5", 30, 40),
("30", "40", 30, 40),
])
def test_init_returns_correct_results(self, minimum, maximum, expected_min, expected_max):
# difference is here -------------^^^^
# pytest can use normal asserts here.
assert self.accept.minimum == expected_min
assert self.accept.maximum == expected_max
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8817 次 |
| 最近记录: |