我有使用摘要的简单 Python 代码
#!/usr/bin/python
# http://stackoverflow.com/questions/2708178/python-using-doctests-for-classes
class Test:
def __init__(self, number):
self._number=number
def multiply_by_2(self):
"""
>>> t.multiply_by_2()
4
"""
return self._number*2
if __name__ == "__main__":
import doctest
doctest.testmod(extraglobs={'t': Test(2)})
Run Code Online (Sandbox Code Playgroud)
我可以将它与 python 解释器一起使用:
> python simple.py
Run Code Online (Sandbox Code Playgroud)
但是,当我从 doctest 模块执行代码时,出现以下错误:
> python -m doctest simple.py
**********************************************************************
File "simple.py", line 10, in simple.Test.multiply_by_2
Failed example:
t.multiply_by_2()
Exception raised:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1289, in __run
compileflags, 1) in test.globs
File "<doctest simple.Test.multiply_by_2[0]>", line 1, in <module>
t.multiply_by_2()
NameError: name …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的班级创建一些单元测试。我想模拟这些,这样我就不会在运行其中一些测试时耗尽我的 API 配额。我有多个测试用例将调用该fetch方法,并且根据传递的 URL,我将得到不同的结果。
我的示例类如下所示:
import requests
class ExampleAPI(object):
def fetch(self, url, params=None, key=None, token=None, **kwargs):
return requests.get(url).json() # Returns a JSON string
Run Code Online (Sandbox Code Playgroud)
我正在看的教程表明我可以做这样的事情:
import unittest
from mock import patch
def fake_fetch_test_one(url):
...
class TestExampleAPI(unittest.TestCase):
@patch('mymodule.ExampleAPI.fetch', fake_fetch_test_one)
def test_fetch(self):
e = ExampleAPI()
self.assertEqual(e.fetch('http://my.api.url.example.com'), """{'result': 'True'}""")
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我收到一条错误消息:
TypeError: fake_fetch_test_one() takes exactly 1 argument (3 given)
Run Code Online (Sandbox Code Playgroud)
requests.get模拟类中方法中的调用的正确方法是什么?我需要能够更改每个测试的模拟响应,因为不同的 URL 可以提供不同的响应类型。
我是新来的unittest。我试图根据列表中的值跳过测试用例。
class UESpecTest(unittest.TestCase):
global testcases_exec_list
testcases = []
testcases = testcases_exec_list
@unittest.skipIf('0' not in self.testcases, "Testcase input not given")
def test_retrieve_spec_info(self):
read_spec_info.open_csv(self.spec_info)
assert (bool(self.spec_info) == True) #Raise assertion if dictionary is empty
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
File "test_ue_cap_main.py", line 39, in UESpecTest
@unittest.skipIf('0' not in self.testcases, "Testcase input not given")
NameError: name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)
我不确定为什么 self 在这里未定义。
我正在使用 Django 测试运行程序来运行我的单元测试。其中一些测试使用工厂在我的本地系统上创建大量文件。它们都有一个可检测的名称,并且可以相当容易地删除。
我试图避免
我编写了一个小型管理命令,用于删除符合预期约定的文件。有没有办法让测试运行程序call_command在完成整个测试套件后运行(而不仅仅是在特定测试的tearDown或方法中)?tearDownClass
setUpClass如果某些条件在功能下不满足,我想跳过所有单元测试。喜欢 -
@classmethod
def setUpClass(cls):
if(!condition):
cls.skipTest("For some reason")
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我预计其他单元测试用例将不会运行。但它显示错误
类型错误:skipTest() 缺少 1 个必需的位置参数:“原因”
我有一个看起来像这样的字典,并且测试类中的所有方法都需要@mock.patch.dict它,有没有办法在类级别而不是在每个方法的顶部执行它。字典设置了一些os.environ变量,如下所示:
@mock.patch.dict('os.environ',
{'MSSQL_DB_NAME': 'tempdb',
'MSSQL_USERNAME': 'sa',
'MSSQL_PASSWORD': 'password',
'MSSQL_DSN': 'MYMSSQL'})
@mock.patch("commonutils.connectors.mssql.pyodbc")
def test_connectivity(self, my_pyodbc):
self.db = Database(os.environ['MSSQL_DB_NAME'],
os.environ['MSSQL_DSN'],
os.environ['MSSQL_USERNAME'],
os.environ['MSSQL_PASSWORD'])
Run Code Online (Sandbox Code Playgroud) 我在 Python 中运行了一些单元测试,并想在所有测试用例运行后调用一个函数。
class MyTestCase(TestCase):
def setUp(self):
self.credentials = credentials
def tearDown(self):
print("finished running " + self._testMethodName)
def tearDownModule(self):
print("finished running all tests")
def test_1(self):
#do something
def test_2(self):
#do something else
Run Code Online (Sandbox Code Playgroud)
setUp 和 tearDown 在每个单独的测试之前和之后运行。然而,我想在所有测试运行完毕后调用一个函数(在本例中为 test_1 和 test_2)。
从文档看来,tearDownModule() 函数应该这样做,但这似乎没有被调用。
我在为这种情况想出一个优雅的解决方案时遇到了麻烦。
假设我在 Python 中有一个单元测试,它将测试可迭代对象中的几个元素。由于此迭代在内存中构建的成本很高,因此我只想通过该setUpClass方法构建一次。然后,在每个测试中,我想将迭代中的每个元素依次传递给测试,我可以使用上下文管理器和subTest方法。这一切都很好。
以下代码是一个模拟测试用例的示例,它完全按照我的描述进行操作:
import unittest
class NumberTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.numbers = []
for x in range(1000):
cls.numbers.append(x)
@classmethod
def tearDownClass(cls):
del cls.numbers
def test_number_is_even(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 0)
def test_number_is_odd(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 1)
def test_number_is_positive(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n > 0)
def test_number_is_negative(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n < 0)
if __name__ == …Run Code Online (Sandbox Code Playgroud) 我正在使用 test.testEqual() 在 Runestone 中开展一个项目。我使用 Anaconda/Spyder 控制台并将代码翻译回 Runestone。Python 似乎不支持 test.testEqual 所以我尝试在 unittest 框架下使用 TestCase.assertEqual(first,second, msg) 方法。我的代码抛出错误消息:TypeError: assertEqual() missing 1 required positional argument: 'second'
但正如我在下面的代码中所示,我在调用中包含了两个参数。我是单元测试的新手,所以不知道去哪里解决这个问题?
从 test.testEqual() 切换到 TestCase.assertEqual(first,second,msg)
from unittest import TestCase
def distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
dsquared = dx**2 + dy**2
result = dsquared**0.5
return result
TestCase.assertEqual(distance(1,2, 1,2),0,msg='Equal')
TestCase.assertEqual(distance(1,2, 4,6), 5, msg='Equal')
TestCase.assertEqual(distance(0,0, 1,1), 2**0.5, msg='Equal')
Run Code Online (Sandbox Code Playgroud)
我们希望这三个测试用例根据它们在 Runestone 控制台中的执行情况通过。
我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。
现在编写测试并尝试使用MagicMock和patch。根据此处的文档https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.htmlunittest.mock,如果我安装mock(使用pip install mock==3.0.5),则有一个向后移植。但是当我将它安装在我的 docker 镜像中时,该行:
from unittest.mock import patch
Run Code Online (Sandbox Code Playgroud)
仍然失败:
Traceback (most recent call last):
File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/library_wq-api-utils/wq_api_utils/tests/tests.py", line 3, in <module>
from unittest.mock import patch
ImportError: No module named mock
Run Code Online (Sandbox Code Playgroud)
我可能在这里对文档感到困惑,但任何帮助在 Python 2.7 和 3.8 中运行相同的代码将不胜感激。谢谢!
python-unittest ×10
python ×9
python-2.7 ×3
python-3.x ×3
unit-testing ×2
django ×1
doctest ×1
factory-boy ×1
mocking ×1
nose ×1
testcase ×1