在python中有没有办法让pyunit测试输出它当前正在运行的测试.例:
def setUp(self):
log.debug("Test %s Started" % (testname))
def test_example(self):
#do stuff
def test_example2(self):
#do other stuff
def tearDown(self):
log.debug("Test %s Finished" % (testname))
Run Code Online (Sandbox Code Playgroud) 有没有办法在单元测试失败时自动启动调试器?
现在我只是手动使用pdb.set_trace(),但这非常繁琐,因为我需要每次添加它并在结束时将其取出.
例如:
import unittest
class tests(unittest.TestCase):
def setUp(self):
pass
def test_trigger_pdb(self):
#this is the way I do it now
try:
assert 1==0
except AssertionError:
import pdb
pdb.set_trace()
def test_no_trigger(self):
#this is the way I would like to do it:
a=1
b=2
assert a==b
#magically, pdb would start here
#so that I could inspect the values of a and b
if __name__=='__main__':
#In the documentation the unittest.TestCase has a debug() method
#but I don't understand how to use it
#A=tests() …Run Code Online (Sandbox Code Playgroud) 如何在从TestCaseunitttest 继承的同一对象中保留更改?
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
foo = 'bar'
def setUp(self):
pass
def test_a(self):
self.assertEqual(self.foo, 'bar')
self.foo = 'can'
def test_f(self):
self.assertEqual(self.foo, 'can')
if __name__ == '__main__':
unittest_main()
Run Code Online (Sandbox Code Playgroud)
即:我希望上面的两个测试通过
我知道assertDictContainsSubset可以在python 2.7中做到这一点,但由于某种原因它在python 3.2中已被弃用.那么有没有办法断言一个dict包含另一个没有assertDictContainsSubset?
这看起来不太好:
for item in dic2:
self.assertIn(item, dic)
Run Code Online (Sandbox Code Playgroud)
还有其他好方法吗?谢谢
我在处理Mock.call_args_list返回的嵌套元组时遇到了一些麻烦.
def test_foo(self):
def foo(fn):
fn('PASS and some other stuff')
f = Mock()
foo(f)
foo(f)
foo(f)
for call in f.call_args_list:
for args in call:
for arg in args:
self.assertTrue(arg.startswith('PASS'))
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来解压缩模拟对象上的call_args_list以便进行断言.这个循环有效,但感觉必须有一个更直接的方式.
我正在搜索一周如何检查是否在pylen的selenium webdriver中选中了复选框,但我只找到了来自JAVA的算法.我引用了webdriver文档并且它没有答案.有人有解决方案吗?
我刚开始写一些单元测试我一直在使用Python项目unittest和coverage.我目前只测试一小部分,但我正在努力解决代码覆盖问题
我运行我的测试并使用以下内容获得覆盖
python -m unittest discover -s tests/
coverage run -m unittest discover -s tests/
coverage report -m
Run Code Online (Sandbox Code Playgroud)
我遇到的问题coverage是告诉我有44%的代码覆盖率并且只计算以下文件:
在单元测试中进行了测试(即,所有未测试的文件都丢失了,而不是在整体覆盖范围内)
在虚拟环境中的库中以及实际测试的代码覆盖率也是如此.当然不应该在结果中包括实际测试?
此外,它说在这些单元测试中实际测试的文件只测试了前几行(在大多数情况下是import语句)
我如何获得更实际的代码覆盖率,或者它是如何实现的?
我正在研究一个python(2.7)程序,它产生了很多不同的matplotlib图(数据不是随机的).我愿意实施一些测试(使用unittest)以确保生成的数字是正确的.例如,我将预期的图形(数据或图像)存储在某个地方,我运行我的函数并将结果与参考进行比较.有没有办法做到这一点 ?
问题
使用mock.patch与autospec=True修补一类不保存该类的实例的属性.
细节
我试图测试一个类Bar,它将类的实例实例Foo化为一个Bar被调用的对象属性foo.所述Bar被测方法被调用bar; 它调用属于foo的Foo实例的方法Bar.在测试中,我在嘲笑Foo,因为我只想测试Bar访问正确的Foo成员:
import unittest
from mock import patch
class Foo(object):
def __init__(self):
self.foo = 'foo'
class Bar(object):
def __init__(self):
self.foo = Foo()
def bar(self):
return self.foo.foo
class TestBar(unittest.TestCase):
@patch('foo.Foo', autospec=True)
def test_patched(self, mock_Foo):
Bar().bar()
def test_unpatched(self):
assert Bar().bar() == 'foo'
Run Code Online (Sandbox Code Playgroud)
类和方法工作得很好(test_unpatched通过),但是当我尝试在测试用例(使用nosetests和pytest测试)中使用Foo时autospec=True,遇到"AttributeError:Mock对象没有属性'foo'"
19:39 $ nosetests -sv …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python单元测试和相对导入,我似乎无法弄明白.我知道有很多相关的问题,但到目前为止他们都没有帮助.对不起,如果这是重复的,但我真的很感激任何帮助.我试图使用PEP 328 http://www.python.org/dev/peps/pep-0328/的语法,但我一定有错.
我的目录结构是:
project/
__init__.py
main_program.py
lib/
__init__.py
lib_a
lib_b
tests/
__init__.py
test_a
test_b
Run Code Online (Sandbox Code Playgroud)
我用以下方法运行测试:
python -m unittest test_module1 test_module2
Run Code Online (Sandbox Code Playgroud)
test_a需要导入lib/lib_a和main_program.这是我试图用于导入的test_a中的代码:
from ..lib import lib_a as lib
from ...project import main_program
Run Code Online (Sandbox Code Playgroud)
都引发了这个错误:
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
我的所有init .py文件当前都是空的.
任何具体的建议将不胜感激!!
编辑:
这可能是答案: Python包? 我还在核实这是否有效.
编辑二:
为了澄清,此时我试图以3种不同的方式运行我的测试文件:
project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a
Run Code Online (Sandbox Code Playgroud)
所有三个都失败并出现与上述相同的错误.当我在项目目录中使用相同的三种语法时,我收到此错误:
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
再次感谢.
python ×10
python-unittest ×10
unit-testing ×6
attributes ×1
coverage.py ×1
matplotlib ×1
mocking ×1
pdb ×1
persistence ×1
python-2.7 ×1
python-3.x ×1
testcase ×1