我正在使用django(1.8) drf uwsgi nginx,并尝试对我制作的单位测试API进行单位。要运行测试,我需要填充数据库(例如创建用户),并在所有测试中使用此数据。所以我尝试了两种方法:
直接在testcase.setup中创建:
class ApiTests(TestCase):
def setUp(self):
Account.objects.create_user(username='username', password='password')
或使用固定装置:
class ApiTests(TestCase):
fixtures = ['dump.json']
接下来,我通过主管运行我的项目:
system("service supervisord startall")
一切准备就绪后,我尝试访问测试中的API进行登录,使用:
login_data = {"username": "username", "password": "password"}
rslt = client.post(HOST_NAME + '/login/', data=login_data)
...但是我无法授权,因为用户以某种方式在DB中不存在!
正如我在文档中的Django测试中发现的那样,TestCase不会将数据写入DB,而是将其存储在交易中,该交易是在测试后回滚的。如我所见在这一侧显示0个项目)。
atm我可以看到一些选项:
- 以某种方式将数据提交DB。
- 在其他方法中填充数据(但是哪个?)。
- 使用不同的测试液体。
您可以帮忙吗?
您不应使用Web服务器来测试Django视图,即使在现实视图中确实需要由Web服务器驱动。为了测试请求/响应行为,您应该使用 django测试客户端。Django Doc有一个很好的例子,引用:
>>> from django.test import Client >>> c = Client() >>> response = c.post('/login/', {'username': 'john', 'password': 'smith'}) >>> response.status_code 200 >>> response = c.get('/customer/details/') >>> response.content b'<!DOCTYPE html...'
最重要的是,DOC在详细说明了如何进行GET
,POST
请求以及如何测试视图的响应等。希望这是有道理的。
是!您已经确定了问题。Django TestCase
在其自己的小绝缘环境中执行。它将在每个套件运行开始时创建以test_
为前缀的测试数据库,并将在交易中执行每个测试,因此,即使您启动了测试套件,请在初始化后暂停它,也将Django Config设置为该Suppersord指向该主管指向测试数据库,继续测试执行,您仍然不会看到任何数据。
您不会在上面示例中看到任何数据的原因是因为测试有其自己的交易,然后当您向Web服务器提出请求时,Web服务器将打开其他交易,并且将无法看到您的测试中的无需数据。
要测试您的观点(在我的经验中)Django测试柜和测试客户,通常会让您95%。它们非常快,因为每个测试都是在交易中执行的,它们会揭露一个测试客户端,以模仿请求(URL路由,中间件,查看加载,模板处理等)。
使用TestCase
应该忠实地测试您的所有逻辑和数据库交互,但是它仍然留下了IF主管,Nginx,UWSGI,Django应用程序的差距。当您使用TestCase进行广泛的覆盖范围时,简单的集成/烟雾测试就足以验证上述服务可以正确通信。IE提出堆栈,点击一个状态页,该页面将测试 ->主管 -> nginx-> uwsgi-> django-> db-> back->退出。
纯粹的功能测试有很多选择,但是为什么当Django为您提供以可靠,快速,易于使用的方式验证应用程序的工具时,为什么要在片状上进行测试以保持级别?
如果您需要服务器可用于浏览器以进行基于浏览器的测试,则DJANGO提供LiveServerTestCase
如果您需要编写广泛的功能测试,我发现在将Fixutre创建方法视为API方法方面取得了巨大的成功。这样,您的测试将针对堆栈(任意堆栈)执行,在这种情况下,它将与您在本地提出的测试堆栈进行执行,但是由于测试是单独的,它们可以针对质量检查或登台甚至堆栈执行。