我正在研究的django项目有大量的initial_data fixture数据.默认情况下,自动加载数据的唯一方法是调用app文件夹中的文件fixtures,并且需要命名文件initial_data.ext(ext为xml或json或yaml等).
我认为这真的很难实现.我宁愿有一个fixtures文件夹,然后在一个initial_data文件夹里面,然后在那里,为该应用程序中的每个模型一个文件.或者那种效果.现在这可以在django做吗?或者可能是其他一些更好的夹具组织方案.
我在Django项目中创建了一个应用程序.出于测试目的,我想创建夹具文件.我发现我可以转储我的数据库,以便在已有数据的情况下自动创建夹具.我想使用一个灯具,所以我使用了命令python ./manage.py dumpdata app,但它返回了一大堆的清单\x02.但如果我使用python ./manage.py auth它完美运行.知道为什么我的dumpdata节目只有\x02.
提前致谢.
我附上截图如下链接:
http://www.cs.ait.ac.th/~fon/wp-content/uploads/2011/01/Screenshot.png
我不是在讨论参数化夹具功能,它允许夹具多次运行以获得硬编码的参数.
我有很多测试遵循以下模式:
httpcode = 401 # this is different per call
message = 'some message' # this is different per call
url = 'some url' # this is different per call
mock_req = mock.MagicMock(spec_set=urllib2.Request)
with mock.patch('package.module.urllib2.urlopen', autospec=True) as mock_urlopen, \
mock.patch('package.module.urllib2.Request', autospec=True) as mock_request:
mock_request.return_value = mock_req
mock_urlopen.side_effect = urllib2.HTTPError(url, httpcode, message, {}, None)
connection = MyClass()
with pytest.raises(MyException):
connection.some_function() # this changes
Run Code Online (Sandbox Code Playgroud)
从本质上讲,我有一个API客户端类,并包含自定义的,有意义的异常,将urllib2错误包装在特定于API的内容中.所以,我有这个模式 - 修补一些方法,并在其中一个上设置副作用.我在十几个不同的测试中使用它,唯一的区别是side_effect的部分使用的三个变量,以及我调用的MyClass()的方法.
有没有办法让这个pytest夹具并传入这些变量?
我需要初始化一些变量,它们在 BOOST_AUTO_TEST_SUITE 中是“全局的”,因此它们的构造函数将在套件启动时被调用,并且它们的析构函数将在最后一个相应的 BOOST_AUTO_TEST_CASE 完成后被调用
有人知道我该怎么做吗?看起来全局装置不是解决方案......
可以从命令行参数参数化测试函数。可以将固定装置的范围限定为一个类。我想将这两件事结合起来,以便每个类都接收赋予类内固定装置的参数化参数。
(本质上,每个命令行参数我需要运行一个非常昂贵的操作,然后针对该操作的结果进行各种便宜、快速的测试,并且我不希望为每个便宜的测试重新运行昂贵的操作,所以我想要一种保存它的方法)
换句话说,我正在寻找与 pytest_generate_tests(metafunc) 等效的函数,它将用于动态参数化固定装置,而不是测试函数。
我已经尝试过但不成功的一件事是读取请求参数并通过 pytest_generate_tests 挂钩设置这些参数。
conftest.py:
def pytest_generate_tests(metafunc):
metafunc.parametrize("result", [
(1,0),(1,2)
])
test_thing.py:
class TestThingy:
@pytest.fixture(scope="class")
def result(self, request):
a,b=request.param
return a+b
#@pytest.mark.parametrize("result", [(0, 1), (1, 2)])
def test_one(self, result):
assert result!=2
Run Code Online (Sandbox Code Playgroud)
运行此测试会导致出现以下错误(请注意,当我在没有 conftest 挂钩且注释行未注释的情况下尝试时,测试运行良好):
@pytest.fixture(scope="class")
def result(self, request):
a,b=request.param
Run Code Online (Sandbox Code Playgroud)
AttributeError:“SubRequest”对象没有属性“param”
我也对任何其他替代方法来实现相同的结果感兴趣。
我的 pytest 很旧(版本 2.8.3)。
pytestmark = pytest.mark.usefixtures("module_level")
@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)
@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)
@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass
Run Code Online (Sandbox Code Playgroud)
但是,我得到的订单是:
class start
module start
class end
module end
Run Code Online (Sandbox Code Playgroud)
这不是我想要的。那么编写模块级设置/清理装置的正确方法是什么(并确保它在一切之前进行设置并在一切之后进行清理)?
对于Django测试,我想加载一个在csv文件中的fixture.最好的方法是什么?
我想用 Fixture 创建一个包含 N 个对象的列表。
我知道我可以做到:
List<Person> persons = new List<Person>();
for (int i = 0; i < numberOfPersons; i++)
{
Person person = fixture.Build<Person>().Create();
persons.Add(person);
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用该CreateMany()方法或其他方法来避免循环?
在py.test文档中,它描述了将工厂方法声明为fixture,例如:
@pytest.fixture
def make_foo():
def __make_foo(name):
foo = Foo()
foo.name = name
return foo
return __make_foo
Run Code Online (Sandbox Code Playgroud)
与仅定义make_foo函数并使用它相比,这样做有什么好处/缺点?我不明白为什么它是固定装置。
我正在尝试使用 pytest 来测试我正在编写的模块。该模块是一个具有长启动时间的进程的包装器。因此,我想确保我有一个正确的设置/拆卸逻辑,以确保初始化不会发生多次。
我当前的代码如下所示:
import pytest
import leelaZeroWrapper
@pytest.fixture(scope='module')
def leela(request):
leela = leelaZeroWrapper.LeelaWrapper()
def quit():
leela.quit()
request.addfinalizer(quit)
return leela
def test_single_play(leela):
leela.reset()
result = leela.play('b', 'a11')
assert result == [{'color': 'black', 'loc': 'a11'}]
def test_single_play_uppercase(leela):
leela.reset()
result = leela.play('WHITE', 'A11')
assert result == [{'color': 'white', 'loc': 'a11'}]
def test_reset(leela):
leela.reset()
leela.play('b', 'a11')
leela.play('w', 'a13')
leela.reset()
assert leela.current_board == []
assert leela.current_move == 0
Run Code Online (Sandbox Code Playgroud)
我注意到我的所有测试都将从调用重置我的模块开始!有没有办法将它添加到夹具中,或者您将如何解决它?
我想要的伪代码:
@pytest.fixture(scope='module')
def leela(request):
leela = leelaZeroWrapper.LeelaWrapper()
def quit():
leela.quit()
def reset():
leela.reset()
request.addfinalizer(quit)
request.add_between_test_resetter(reset) …Run Code Online (Sandbox Code Playgroud)