如何捕获单个单元测试的时间,包括设置成本?
我有一个带有设置程序的测试基础,需要花费很多时间才能完成.我有几个测试从测试基础下来,我有一个装饰器,理论上应该打印出运行每个测试所需的时间:
class TestBase(unittest.TestCase):
def setUp(self):
# some setup procedure that takes a long time
def timed_test(decorated_test):
def run_test(self, *kw, **kwargs):
start = time.time()
decorated_test(self, *kw, **kwargs)
end = time.time()
print "test_duration: %s (seconds)" % (end - start)
return run_test
class TestSomething(TestBase):
@timed_test
def test_something_useful(self):
# some test
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这些测试时,我发现我只打印测试运行所花费的时间,不包括设置时间.切线上,一个相关的问题可能是:最好处理测试框架之外的时间安排吗?
我确实有一组使用python的unittest模块编写的单元测试。他们正在使用setUpModule()函数来加载具有运行测试(包括某些http会话)所需的共享“材料”的全局变量。
当使用进行我的测试时unittest,它们py.test无法正常运行。
我对其进行了一些修补,以使其使用旧的pytest夹具函数(恰好与unittest的函数名称不同)运行。有效,但仅当未在多个线程上执行时,这是我要使用的功能。
在我的情况下,文档示例没有用,因为我确实有20个类(unittest.TestCase),每个类内部有10个测试。显然,我不想为每个测试添加新参数。
到目前为止,我使用类setUp()方法将共享字典加载到self内,并在每个测试中使用它的形式。
#!/usr/bin/env python
# conftest.py
@pytest.fixture(scope="session")
def manager():
return { "a": "b"}
Run Code Online (Sandbox Code Playgroud)
现在测试:
#!/usr/bin/env python
# tests.py
class VersionTests(unittest.TestCase):
def setUp(self):
self.manager = manager
def test_create_version(self):
# do something with self.manager
pass
Run Code Online (Sandbox Code Playgroud)
请记住,我需要一个可以与多个线程一起使用的解决方案,一次调用固定装置。
有功能:assertSequenceEqual,assertListEqual和assertTupleEqual单元测试模块中。
但是我该如何实现相反的行为?如何断言列表不相等?
尝试编写一个单元测试,检查用户是否输入了正确的密码.
使用Django的本机身份验证功能user.check_password.
问题是由于某种原因,check_password不接受user对象自己的密码.例如,这会引发错误:
assert user.check_password(user.password), "Password doesn't match"
Run Code Online (Sandbox Code Playgroud)
user.password 返回MD5 unicode字符串.
有谁知道为什么这不通过支票以及检查如何通过?
对于Python 2.7:
list1 = [1, 2]
self.assertIn(1, list1)
self.assertIn(2, list1)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我更轻松?就像是:
self.assertIn((1,2), list1) # I know this is wrong, just an example
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写单元测试,Bar以便Foo对的方法进行调用read()。我添加了patch命令,setUp()因为其他测试也将使用此补丁。
如何检查该read()函数是否已使用期望的参数调用?
foo.py
class Foo(object):
def __init__(self):
self.table = {'foo': 1}
def read(self, name):
return self.table[name]
Run Code Online (Sandbox Code Playgroud)
bar.py
import foo
class Bar(object):
def act(self):
a = foo.Foo()
return a.read('foo')
Run Code Online (Sandbox Code Playgroud)
test_bar.py
import bar
import unittest
from mock import patch
class TestBar(unittest.TestCase):
def setUp(self):
self.foo_mock = patch('bar.foo.Foo', autospec=True).start()
self.addCleanup(patch.stopall)
def test_can_call_foo_with_correct_arguments(self):
a = bar.Bar()
a.act()
self.foo_mock.read.assert_called_once_with('foo')
Run Code Online (Sandbox Code Playgroud)
python -m unittest discover
F
======================================================================
FAIL: test_can_call_foo_with_correct_arguments (test_bar.TestBar)
----------------------------------------------------------------------
Traceback (most recent call …Run Code Online (Sandbox Code Playgroud) 单元测试和Python的新功能,在单元测试的教程介绍中遇到了示例,其中使用with语句来捕获ValueError.
正在测试的脚本(invoice_calculator.py)是:
def divide_pay(amount, staff_hours):
"""
Divide an invoice evenly amongst staff depending on how many hours they
worked on a project
"""
total_hours = 0
for person in staff_hours:
total_hours += staff_hours[person]
if total_hours == 0:
raise ValueError("No hours entered")
per_hour = amount / total_hours
staff_pay = {}
for person in staff_hours:
pay = staff_hours[person] * per_hour
staff_pay[person] = pay
return staff_pay
Run Code Online (Sandbox Code Playgroud)
单元测试包括此功能,以便捕获边缘情况,其中staff_hours = None:
import unittest
from invoice_calculator import divide_pay
class InvoiceCalculatorTests(unittest.TestCase):
def test_equality(self):
pay = …Run Code Online (Sandbox Code Playgroud) python unit-testing with-statement python-2.7 python-unittest
当我assertEqual()在REPL中使用两个字典时,会显示一个差异,例如:
>>> import unittest
>>> class A(unittest.TestCase):
... pass
...
>>> a = A()
>>> d1 = dict(zip(range(10), range(1000000, 1000010)))
>>> d2 = dict(zip(range(3, 13), range(1000003, 1000013)))
>>> a.assertEqual(d1, d2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/unittest/case.py", line 820, in assertEqual
assertion_func(first, second, msg=msg)
File "/usr/lib/python3.5/unittest/case.py", line 1111, in assertDictEqual
self.fail(self._formatMessage(msg, standardMsg))
File "/usr/lib/python3.5/unittest/case.py", line 665, in fail
raise self.failureException(msg)
AssertionError: {0: 1000000, 1: 1000001, 2: 1000002, 3: 10[73 chars]0009} != {3: …Run Code Online (Sandbox Code Playgroud) 我正在用Python编写一些单元测试,似乎我的测试以某种方式在测试函数之间共享对象,这看起来很奇怪.所以,我有类似的东西:
import unittest
class TestMyMethods(unittest.TestCase):
def test_create(self):
c = MyClass()
c.create_customer('Luca')
self.assertEqual(len(c.data), 1)
def test_connect(self):
c = MyClass()
c.connect_customer('Angela', 'Peter')
self.assertEqual(len(c.data), 2)
Run Code Online (Sandbox Code Playgroud)
如果我评论任何一个测试,另一个通过,但两个一起失败.经过检查,似乎该c对象在两个测试函数之间仍然存在,但为什么会这样呢?在该函数中,创建了新实例.这是unittest框架的一些"功能" 吗?
from collections import defaultdict
class MyClass(object):
def __init__(self):
self.data = defaultdict()
def create_customer(self, cust):
if cust not in self.data:
self.data[cust] = list()
def connect_customer(self, a, b):
if a not in self.data:
self.data[a] = list()
if b not in self.data:
self.data[b] = list()
self.data[a].append(b)
Run Code Online (Sandbox Code Playgroud)
好的,这很奇怪.我看了历史,在此之前:
class MyClass(object):
def __init__(self, data=defaultdict()):
self.data = data …Run Code Online (Sandbox Code Playgroud) 在Windows上,我有一个Python代码库,unittest在子文件夹中有一些单元测试(基于).
我使用Windows命令提示符更改为文件夹并使用运行所有测试python -m unittest subfolder/tests.py.然后检测并运行文件中的测试.
当我尝试在Windows子系统for Linux bash shell中执行相同操作时,我会在堆栈跟踪中收到以下错误:
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
main(module=None)
File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
self.parseArgs(argv)
File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
self.createTests()
File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
self.module)
File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names] …Run Code Online (Sandbox Code Playgroud) python ×10
python-unittest ×10
unit-testing ×4
django ×3
python-2.7 ×3
bash ×1
fixtures ×1
mocking ×1
passwords ×1
pytest ×1
testing ×1
windows ×1
xdist ×1