我正在尝试使用该mock库模拟无限生成器函数。(或者unittest.mock如果你有Python 3.3)
这是无限生成器的最小工作示例。如果我可以成功地模拟这个,那么我将希望能够模拟我正在使用的实际函数。
import itertools
def infinite_generator():
thing = itertools.cycle([1, 2])
while True:
yield next(thing)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试过的:
import mock
import itertools
mock_func = mock.MagicMock()
mock_func.__iter__.return_value = itertools.cycle([1, 2])
Run Code Online (Sandbox Code Playgroud)
我想像函数mock_func一样发挥作用infinite_generator。
例如,我希望能够执行以下操作:
>>> a = mock_func()
>>> next(a)
1
>>> next(a)
2
>>> next(a)
1
>>> next(a)
2
Run Code Online (Sandbox Code Playgroud)
ETC。
然而,目前next(a)返回的东西像
<MagicMock name='mock().__next__()' id='3043937712'>
我从另一个 Python 脚本调用以下脚本:
测试.py 日志文件
它应该运行测试并将结果保存在日志文件中。但由于某种原因,后面的命令unittest.main(testRunner=runner)没有被执行。我什至不确定文件写入后是否会关闭。还有其他方法编写脚本吗?
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re, sys
class SeleniumYahooTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "https://www.yahoo.com"
self.verificationErrors = []
self.accept_next_alert = True
.
.
.
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == '__main__':
if len(sys.argv)>1:
testcase_name = sys.argv[0]
result_file = sys.argv[1]
del(sys.argv[1:])
f = open(result_file, "a")
result_file.write("This …Run Code Online (Sandbox Code Playgroud) 这是我第一次在学校作业中使用 Python 的单元测试。我基本上有一个 Circle 对象,我在其中使用 pyunit 来确保数据正确存储。
我注意到 Python 只计算测试用例的方法数量,而不是断言语句的数量。
例如,我想测试方法是否正常工作,尽管有 4 个断言语句,Python 仅将以下内容算作 2 个测试。这确实让我措手不及,因为 Java 的 JUnit 会计算断言语句的数量。
def test_xcrd(self):
self.assertTrue(self.point.xcrd() == 1)
self.assertFalse(self.point.xcrd() == 5)
def test_ycrd(self):
self.assertTrue(self.point.ycrd() == 2)
self.assertFalse(self.point.ycrd() == 10)
Run Code Online (Sandbox Code Playgroud)
python 中的“规范”是什么?每个方法应该只有一个断言语句吗?
Python 单元测试在正常、错误或失败时给出“.”、E 或 F。我们可以通过设置 verbosity = 0 或 /dev/null 来避免它。但我们怎样才能改变它呢?我的意思是我想在每次测试后写入 PASS、FAIL 或 ERROR 而不是 .、E 或 F,而不使用详细标志 -V 进行输出。
我正在寻找以下类型的输出:
谢谢祖贝尔
我正在对现有库开发单元测试,我想测试调用函数的参数是否符合某些条件。就我而言,要测试的函数是:
class ...
def function(self):
thing = self.method1(self.THING)
thing_obj = self.method2(thing)
self.method3(thing_obj, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
对于单元测试,我按以下方式修补了方法 1、2 和 3:
import unittest
from mock import patch, Mock
class ...
def setUp(self):
patcher1 = patch("x.x.x.method1")
self.object_method1_mock = patcher1.start()
self.addCleanup(patcher1.stop)
...
def test_funtion(self)
# ???
Run Code Online (Sandbox Code Playgroud)
在单元测试中,我想提取参数 1、2、3、4 并比较它们,例如查看第三个参数是否小于第四个参数(2 < 3)。我将如何继续使用模拟或其他库来解决这个问题?
这是我的前几行代码,但我已经编码了 20 年,所以我很快就想让单元测试运行起来。
我在用
这是我所在文件夹的内容。
Directory: C:\DATA\Git\Py\my_first_code
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 19/01/2019 21:42 __pycache__
-a---- 19/01/2019 21:35 289 messing.py
-a---- 19/01/2019 21:42 204 test_messing.py
-a---- 19/01/2019 22:07 0 __init__.py
Run Code Online (Sandbox Code Playgroud)
据我所知,我不在“venv”中。
这是 的内容test_messing.py。
import unittest
class Test_Math(unittest.TestCase):
def math_multiply__when__2_times_2__then__equals_4(self):
self.assertEqual(2 * 2, 4)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
该__init__.py是空的,我说,看看是否有帮助,并messing.py含有像一本书一个8行的一些代码。
当我尝试在 VS Code …
我有一个具有__exit__and__enter__函数的类,以便我可以在 with 语句中使用它,例如:
with ClassName() as c:
c.do_something()
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试编写一个单元测试来测试这个。基本上,我试图测试do_something()只被调用过一次。
一个例子(我称之为testmocking1):
class temp:
def __init__(self):
pass
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def test_method(self):
return 1
def fun():
with temp() as t:
return t.test_method()
Run Code Online (Sandbox Code Playgroud)
我的测试:
import unittest
import test_mocking1
from test_mocking1 import fun
import mock
from mock import patch
class MyTestCase(unittest.TestCase):
@patch('test_mocking1.temp', autospec = True)
def test_fun_enter_called_once(self, mocked_object):
fun()
mocked_object.test_method.assert_called_once()
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
所以我希望这会通过,因为 test_method 在函数中只被调用了一次fun()。但我得到的实际结果是: …
我正在尝试测试一种需要json.load在 Python 3.6 中使用的方法。经过多次尝试,我尝试“正常”运行测试(使用来自 CLI 的常用 unittest.main()),并在 iPython REPL 中运行。
具有以下功能(为了示例而简化)
def load_metadata(name):
with open("{}.json".format(name)) as fh:
return json.load(fh)
Run Code Online (Sandbox Code Playgroud)
通过以下测试:
class test_loading_metadata(unittest2.TestCase):
@patch('builtins.open', new_callable=mock_open(read_data='{"disabled":True}'))
def test_load_metadata_with_disabled(self, filemock):
result = load_metadata("john")
self.assertEqual(result,{"disabled":True})
filemock.assert_called_with("john.json")
Run Code Online (Sandbox Code Playgroud)
测试文件的执行结果令人心碎:
TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'
Run Code Online (Sandbox Code Playgroud)
在命令行中执行同样的事情时,给出了一个成功的结果。
我尝试了几种方法(用with,作为装饰器修补),但我唯一能想到的是unittest库本身,以及它可能会做什么来干扰模拟和补丁。
还检查了 virtualenv 和 ipython 中的 python 版本,json库的版本。
我想知道为什么看起来相同的代码在一个地方工作而在另一个地方不起作用。或者至少是一个指向正确方向的指针,以了解为什么会发生这种情况。
我正在尝试为依赖于另一个私有方法的方法编写一些单元测试。- 如下例所示:
def is_member_of(self, group_name):
members = self.__get_group_members(group_name)
Run Code Online (Sandbox Code Playgroud)
我想模拟的私有方法是__get_group_members;我还想模拟私有属性,__user_id因为它将在is_member_of函数中使用(上面的示例中未显示)。
到目前为止我所拥有的:
import unittest
from unittest import mock
class Test(unittest.TestCase):
group_data = []
user_id = 'test_user_id'
def mock_dependencies(self, x):
x.__user_id = mock.PropertyMock(return_value=self.user_id)
x.__get_group_members = mock.MagicMock(return_value=self.group_data)
def first_test(self):
x = A(('name', 'group'))
self.mock_dependencies(x)
x.is_member_of('test_group')
Run Code Online (Sandbox Code Playgroud)
当我调用x.is_member_of()模拟时,它没有按预期工作。
在我的单元测试中,我已经使用禁用了 CSRF
WTF_CSRF_ENABLED = False
Run Code Online (Sandbox Code Playgroud)
失败的示例测试用例
def test_get_tags(self):
tag_name = 'tag_1'
r = self.client.get(url_for('tag.tags'))
self.assertIn(tag_name, r.get_data(as_text=True))
Run Code Online (Sandbox Code Playgroud)
但是在我的模板中,我调用了 csrf 令牌。
{% for form in tag_forms%}
{{form.csrf_token}}
{{form.tag_name}}
{{form.update}}
{{form.delete}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这导致以下错误
jinja2.exceptions.UndefinedError: 'app.tag.forms.UpdateTagForm object' has no attribute 'csrf_token'
Run Code Online (Sandbox Code Playgroud)
我猜这个错误是由于我已经禁用了 CSRF 令牌。如何解决这个问题?
python-unittest ×10
python ×9
python-3.x ×5
mocking ×3
python-2.7 ×2
unit-testing ×2
flask ×1
jinja2 ×1