标签: python-unittest

Python unittest,如何显示更好的组/测试名称?

使用 Python Unittest,这是一个测试套件的示例:

import unittest

# Here's our "unit".
def IsOdd(n):
    return n % 2 == 1

# Here's our "unit tests".
class IsOddTests(unittest.TestCase):

    def testOne(self):
        self.failUnless(IsOdd(1))

    def testTwo(self):
        self.failIf(IsOdd(2))

def main():
    unittest.main(verbosity=2)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

结果:

testOne (__main__.IsOddTests) ... ok
testTwo (__main__.IsOddTests) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
Run Code Online (Sandbox Code Playgroud)

是否可以增强测试的显示,例如:

Testing ODD method
Testing with value is 1 (__main__.IsOddTests) ... ok
Testing with value is 2 (__main__.IsOddTests) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s …
Run Code Online (Sandbox Code Playgroud)

python python-unittest

0
推荐指数
1
解决办法
2516
查看次数

包含输入/输出的导入模块

我有一个python模块文件(func.py)和一个单元测试文件(f_test.py):

# func.py

def f(x):
    return x + 1

x = input("Enter x: "))

print("f(x): " + str(f(x)))
Run Code Online (Sandbox Code Playgroud)

# f_test.py

import unittest
from func import f

class MyTest(unittest.TestCase):
    def test(self):
        self.assertEqual(f(1), 2)
Run Code Online (Sandbox Code Playgroud)

当我运行时,f_test.py我希望测试套件能够被执行(成功).相反,我看到以下输入:

Finding files... done.
Importing test modules ... Enter x:
Run Code Online (Sandbox Code Playgroud)

如果我func.py从那时注释掉输入/输出行,我会得到预期的行为.如何在不修改的情况下实现它func.py

python python-3.x python-unittest

0
推荐指数
1
解决办法
66
查看次数

Python:使用 Mock 覆盖类方法

有一个FooObject只有一个version字段和一个update()方法的类。

class FooObject(models.Model):
  version = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

我想update使用 Python 的Mock工具覆盖单元测试的方法。我该怎么做?我应该用patch它吗?

foo_object.update = Mock(self.version = '123')
Run Code Online (Sandbox Code Playgroud)

python mocking python-unittest

0
推荐指数
1
解决办法
6737
查看次数

Python补丁模拟似乎被调用,但断言失败

我正在使用 Python 2.6.6

我想要做的是用 Mock 替换对象的创建,以确保进行正确的调用。应该是直截了当的。

我的模块:

import dir.SubModule

class Cls( object ):
    def Start( self ):
        self.__obj = dir.SubModule.SubCls()
        self.__obj.foo()
Run Code Online (Sandbox Code Playgroud)

我的测试:

import MyModule
import unittest
from mock import Mock, MagicMock, patch

class MyTest( unittest.TestCase ):
    def setUp( self ):
        self.uut = MyModule.Cls()

    def test_one( self ):
        with patch( 'dir.SubModule.SubCls', spec=True ) as mockObj:
            print "mock calls before"
            print mockObj.mock_calls
            self.uut.Start()

            print "called: "      + str( mockObj.called )
            print "foo called: " + str( mockObj.foo.called )
            print "call_count: "  + …
Run Code Online (Sandbox Code Playgroud)

python unit-testing python-unittest python-unittest.mock

0
推荐指数
1
解决办法
7436
查看次数

unittest python中变量值的变化

import unittest

class TestTemplate(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        self.result = 'error'
        print "setUpClass"

    @classmethod
    def tearDownClass(self):
        print "The value of result is, ",self.result
        if self.result == 'ok':
            print "it is working"
        print "The value of cls result is : ", self.result
        print "TearDownClass"


class MyTest(TestTemplate):

    def test_method_one(self):
        self.result = 'ok'
        print self.result


if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

tearDownClassself.result 的值是error,而是应该是okay因为我在方法中改变了它?这有什么解决办法吗?

python unit-testing nose python-2.7 python-unittest

0
推荐指数
1
解决办法
3625
查看次数

Python unittest以失败告终

我在python中运行以下单元测试,结果应该是正确的,但是单元测试出错了.

这是什么错误?

这是我必须测试的课程

class Strategy:
    _a = 0
    _b = 0
    _result = 0

    def __init__(self, a, b):

        try:
            int(a)
            int(b)
        except ValueError:
            raise ValueError()

        self._a = a
        self._b = b
Run Code Online (Sandbox Code Playgroud)

这是我的单位测试

def test_invalideValue(self):
    with self.assertRaises(ValueError) as cm:
        StrategyAddition('A', 3)

    self.assertEqual(cm.exception, ValueError())
Run Code Online (Sandbox Code Playgroud)

而这就是看跌期权

Failure
Traceback (most recent call last):
  File "C:\Users\Michi\workspace_python\DesignPatternPython\Strategy\TestStrategy.py", line 24, in test_invalideValue
    self.assertEqual(cm.exception, ValueError())
AssertionError: ValueError() != ValueError()
Run Code Online (Sandbox Code Playgroud)

python unit-testing python-unittest

0
推荐指数
1
解决办法
66
查看次数

对依赖于数据库的函数进行单元测试

我正在对某些功能进行测试。我有一个使用数据库查询的函数。因此,我浏览了博客和文档,这些博客和文档说我们必须创建一个内存或测试数据库才能使用此类功能。以下是我的功能,

def already_exists(story_data,c):
    # TODO(salmanhaseeb): Implement de-dupe functionality by checking if it already
    # exists in the DB.
    c.execute("""SELECT COUNT(*) from posts where post_id = ?""", (story_data.post_id,))
    (number_of_rows,)=c.fetchone()
    if number_of_rows > 0:
        return True
    return False
Run Code Online (Sandbox Code Playgroud)

该函数访问生产数据库。我的问题是,在测试时,我创建一个内存数据库并在那里填充我的值,我将查询该数据库(测试数据库)。但我想测试我的already_exists()函数,从测试调用我的already_exists函数后,我的生产数据库将被命中。在测试此功能时如何使我的测试数据库命中?

python unit-testing database-testing python-unittest

0
推荐指数
1
解决办法
5798
查看次数

在单元测试中使用补丁时模拟对象的顺序

@patch('module1.api.method1')  
@patch('module1.api.method2')
class TestApi(unittest.TestCase):

        @patch('module1.api.connec1')    
        @patch('module1.api.connec2')  
        def test_some_method(self, mockMethod1, mockMethod2, 
                                mockConnec1, mockConnec2):
            # some code.....
Run Code Online (Sandbox Code Playgroud)

测试方法中提到的模拟对象的顺序是否应该与patch? 我们是否需要提及所有类级别和方法级别补丁的模拟对象?

如果有 20 个补丁对象,方法会一样吗?

python mocking python-unittest

0
推荐指数
1
解决办法
121
查看次数

如何正确使用 self.assertRaisesRegex 作为上下文管理器?

请检查以下代码:

import unittest


def fn():
    raise KeyError('my message')


class Test(unittest.TestCase):
    def test_passes(self):
        with self.assertRaisesRegex(KeyError, 'my message'):
            fn()

        with self.assertRaisesRegex(KeyError, 'my'):
            fn()

    def test_fails(self):
        # Why does this test fail?
        # Isn't '^my message$' a valid regex?
        # How do I check if the message is exactly 'my message'?
        with self.assertRaisesRegex(KeyError, '^my message$'):
            fn()


unittest.main()
Run Code Online (Sandbox Code Playgroud)

在输出中,我收到以下测试消息test_fails

AssertionError:“^我的消息$”与“'我的消息'”不匹配


我缺少什么?


正如评论中提到的,这些是我的问题:

  • 为什么这个测试会失败?
  • 不是'^my message$'有效的正则表达式吗?
  • 如何检查该消息是否是exactly 'my message'

python python-3.x python-unittest

0
推荐指数
1
解决办法
7700
查看次数

测试在对象初始化 Python 期间是否调用了某个方法

我有一个超类,它在初始化期间调用某个独立的方法。就像是

class MasterClass:
    def __init__(self, *args, **kwargs):
        if type(self).__name__ == "SpecificClass":
            call_a_module_method()
Run Code Online (Sandbox Code Playgroud)

我想测试调用这个类的子类SpecificClass是否会call_a_module_method调用方法。

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

0
推荐指数
1
解决办法
236
查看次数

使用 unittest 为 Flask 应用程序编写单元测试

我是单元测试的新手,我正在尝试为我编写的代码编写一个测试,这是一个注释系统,可将注释和一些额外信息保存到数据库中。这是代码:

@app.route("/", methods=["GET", "POST"])
def home():

    if request.method == "POST":
        ip_address = request.remote_addr
        entry_content = request.form.get("content")
        formatted_date = datetime.datetime.today().strftime("%Y-%m-%d/%H:%M")
        app.db.entries.insert({
            "content": entry_content, 
            "date": formatted_date, 
            "IP": ip_address})

    return "GET method called"
Run Code Online (Sandbox Code Playgroud)

我想编写一个测试来检查POST它的一部分,但我不知道如何在POST方法中传递内容并确保一切正常。

你能帮我解决这个问题吗?

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

0
推荐指数
1
解决办法
8961
查看次数

在python中断言两个变量几乎相等

这里有两个变量:earnings_forecast,actual_earning(数值变量)

我想断言这两个变量是否相等,相对于actual_earning变量可接受±2%的差异.

假设: earnings_forecast = 6 actual_earnings = 5.19

我不能使用,assertEqual(earnings_forecast, actual_earnings)因为它会尝试做一个完全匹配,而我想断言这两个变量几乎相等,可接受的±2%差异.

python python-unittest

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