标签: python-unittest

定时单元测试,包括设置

如何捕获单个单元测试的时间,包括设置成本?

我有一个带有设置程序的测试基础,需要花费很多时间才能完成.我有几个测试从测试基础下来,我有一个装饰器,理论上应该打印出运行每个测试所需的时间:

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 testing django unit-testing python-unittest

4
推荐指数
1
解决办法
588
查看次数

有全局夹具时如何将python unittests转换为py.test?

我确实有一组使用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)

请记住,我需要一个可以与多个线程一起使用的解决方案,一次调用固定装置。

python fixtures pytest python-unittest xdist

4
推荐指数
1
解决办法
4316
查看次数

assertListEqual否定(相反)

有功能:assertSequenceEqualassertListEqualassertTupleEqual单元测试模块中。

但是我该如何实现相反的行为?如何断言列表不相等?

python python-unittest

4
推荐指数
1
解决办法
797
查看次数

Django User.check_password不会通过密码检查

尝试编写一个单元测试,检查用户是否输入了正确的密码.

使用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 passwords django python-unittest

4
推荐指数
1
解决办法
4001
查看次数

在Python单元测试中是否存在子列表的断言?

对于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)

python python-2.7 python-unittest

4
推荐指数
2
解决办法
1565
查看次数

模拟类并在对方法的调用中进行断言的正确方法

我正在尝试编写单元测试,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 unit-testing mocking python-2.7 python-unittest

4
推荐指数
1
解决办法
2048
查看次数

理解with语句以捕获unittest类中的ValueError

单元测试和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

4
推荐指数
1
解决办法
4191
查看次数

如何在Django单元测试中输出完整的差异?

当我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 django unit-testing python-unittest

4
推荐指数
1
解决办法
632
查看次数

python unittest在测试之间共享对象实例

我正在用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)

python python-unittest

4
推荐指数
1
解决办法
823
查看次数

为什么Python的unittest给出"ImportError:不支持按文件名导入".在WSL bash?

在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 windows bash python-unittest

4
推荐指数
1
解决办法
5218
查看次数