标签: python-unittest

执行Python doctest代码

我有使用摘要的简单 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)

python doctest python-unittest

2
推荐指数
1
解决办法
1429
查看次数

如何在我的类中模拟使用 requests.get 的方法?

我正在尝试为我的班级创建一些单元测试。我想模拟这些,这样我就不会在运行其中一些测试时耗尽我的 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 可以提供不同的响应类型。

python mocking python-2.7 python-unittest

2
推荐指数
1
解决办法
9625
查看次数

Python单元测试:“自我”未定义

我是新来的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 在这里未定义。

python nose python-2.7 python-unittest

2
推荐指数
1
解决办法
1740
查看次数

Django/unittest 在测试运行程序末尾运行命令

我正在使用 Django 测试运行程序来运行我的单元测试。其中一些测试使用工厂在我的本地系统上创建大量文件。它们都有一个可检测的名称,并且可以相当容易地删除。

我试图避免

  1. 保持文件删除 cron 作业运行
  2. 如果检测到我们正在测试,请更改我的自定义图像模型的代码以删除该文件。相反,我希望在测试运行结束时运行一次(且仅一次)命令来清理测试生成的所有文件。

我编写了一个小型管理命令,用于删除符合预期约定的文件。有没有办法让测试运行程序call_command在完成整个测试套件后运行(而不仅仅是在特定测试的tearDown或方法中)?tearDownClass

python django unit-testing factory-boy python-unittest

2
推荐指数
1
解决办法
1476
查看次数

如何从 setUpClass 跳过所有测试

setUpClass如果某些条件在功能下不满足,我想跳过所有单元测试。喜欢 -

@classmethod
def setUpClass(cls):
    if(!condition):
        cls.skipTest("For some reason")
Run Code Online (Sandbox Code Playgroud)

执行此操作后,我预计其他单元测试用例将不会运行。但它显示错误

类型错误:skipTest() 缺少 1 个必需的位置参数:“原因”

python python-3.x python-unittest

2
推荐指数
1
解决办法
829
查看次数

类级别的 mock.patch.dict - python 单元测试

我有一个看起来像这样的字典,并且测试类中的所有方法都需要@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 python-unittest

2
推荐指数
1
解决办法
5253
查看次数

在 Python unittest 中,如何在 TestCase 中的所有测试都已执行后调用函数?

我在 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 python-unittest

2
推荐指数
1
解决办法
1657
查看次数

使用 Python 的 unittest subTest 时避免在测试中重复?

我在为这种情况想出一个优雅的解决方案时遇到了麻烦。

假设我在 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)

python unit-testing python-3.x python-unittest

2
推荐指数
1
解决办法
1875
查看次数

类型错误:assertEqual() 缺少 1 个必需的位置参数:'second'

我正在使用 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 控制台中的执行情况通过。

testcase python-unittest

2
推荐指数
1
解决办法
4141
查看次数

如何在 Python 3.8+ 和 Python 2.7+ 中使用 unittest.mock 包?

我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。

现在编写测试并尝试使用MagicMockpatch。根据此处的文档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 python-2.7 python-3.x python-unittest

2
推荐指数
1
解决办法
931
查看次数