如何在 Django 中编写单元测试
How to write Unit Test in Django
我正在尝试编写单元测试,但我是 django 的新手,不确定如何测试此功能。据我所知,在手动测试时一切正常,但建议为其编写单元测试。
我有这个功能:
def time_encode(hours):
now = timezone.now().replace(second=0, microsecond=0)
remainder = now.minute % 15
delta = (15 - remainder)
timeFrom = now + timedelta(minutes=delta)
timeTo = timeFrom + timedelta(hours=hours)
return (timeFrom, timeTo)
在此视图中调用:
@csrf_exempt
def emulate_create(request):
args = json.loads(request.body, object_hook=utils._datetime_decoder)
resourceId, count, hours = args['resourceId'], args['count'], args['hours']
print resourceId
timeFrom, timeTo = utils.time_encode(hours)
print timeFrom
reservation = ReservationProspect(
byUser=request.user,
forUser=request.user,
resource=get_object_or_404(Resource, uuid=resourceId),
modality=get_object_or_404(Modality, name="online"),
timeFrom=timeFrom,
timeTo=timeTo,
count=count
)
return HttpResponse(
json.dumps(
[reservation.toDict()],
default=utils._datetime_encoder
)
)
我觉得我不应该测试视图中的内容,但我应该为一些测试用例测试函数 time_encode,因为它的目的是 return 最近的 15 个 timeFrom未来的分钟间隔和 timeTo 是 'hours' 参数远离 timeFrom。同样重要的是,日期时间始终 returned 秒和毫秒为零。您对如何测试此代码有何建议?
我想我会为函数编写至少两个单元测试(一个检查是否针对给定的输入生成预期的输出。
然后另外我会为视图本身编写一些测试,例如它会产生预期的输出吗? 404 是否按预期返回?
我也会考虑测试这个 ReservationProspect class 以防它是你的。
测试挺多的,不过我一般都是遵循测试驱动开发,有条件的时候提前写测试。它非常适合我。
...顺便说一下,如果您关于测试 Django/Python 的问题更笼统——Django 在他们的网页上有一些好东西
https://docs.djangoproject.com/en/1.8/topics/testing/overview/
在教程中:
https://docs.djangoproject.com/en/1.8/intro/tutorial05/
from django.test import TestCase
class ViewTest(TestCase):
def test_view_returns_OK(self):
response = self.client.get('/')
self.assertEqual(response.status_code,200)
class FunctionTest(TestCase):
def test_function_returns_expected_result(self):
response = time_encode(10)
expected = "XYZ"
self.assertEqual(response, expected)
关于您对导入的评论:
from utils import time_encode
- 在上述导入之后你可以将其用作 time_encode
import utils
- 在上述导入之后你必须将它用作 utils.time_encode
我正在尝试编写单元测试,但我是 django 的新手,不确定如何测试此功能。据我所知,在手动测试时一切正常,但建议为其编写单元测试。
我有这个功能:
def time_encode(hours):
now = timezone.now().replace(second=0, microsecond=0)
remainder = now.minute % 15
delta = (15 - remainder)
timeFrom = now + timedelta(minutes=delta)
timeTo = timeFrom + timedelta(hours=hours)
return (timeFrom, timeTo)
在此视图中调用:
@csrf_exempt
def emulate_create(request):
args = json.loads(request.body, object_hook=utils._datetime_decoder)
resourceId, count, hours = args['resourceId'], args['count'], args['hours']
print resourceId
timeFrom, timeTo = utils.time_encode(hours)
print timeFrom
reservation = ReservationProspect(
byUser=request.user,
forUser=request.user,
resource=get_object_or_404(Resource, uuid=resourceId),
modality=get_object_or_404(Modality, name="online"),
timeFrom=timeFrom,
timeTo=timeTo,
count=count
)
return HttpResponse(
json.dumps(
[reservation.toDict()],
default=utils._datetime_encoder
)
)
我觉得我不应该测试视图中的内容,但我应该为一些测试用例测试函数 time_encode,因为它的目的是 return 最近的 15 个 timeFrom未来的分钟间隔和 timeTo 是 'hours' 参数远离 timeFrom。同样重要的是,日期时间始终 returned 秒和毫秒为零。您对如何测试此代码有何建议?
我想我会为函数编写至少两个单元测试(一个检查是否针对给定的输入生成预期的输出。
然后另外我会为视图本身编写一些测试,例如它会产生预期的输出吗? 404 是否按预期返回?
我也会考虑测试这个 ReservationProspect class 以防它是你的。
测试挺多的,不过我一般都是遵循测试驱动开发,有条件的时候提前写测试。它非常适合我。
...顺便说一下,如果您关于测试 Django/Python 的问题更笼统——Django 在他们的网页上有一些好东西 https://docs.djangoproject.com/en/1.8/topics/testing/overview/ 在教程中: https://docs.djangoproject.com/en/1.8/intro/tutorial05/
from django.test import TestCase
class ViewTest(TestCase):
def test_view_returns_OK(self):
response = self.client.get('/')
self.assertEqual(response.status_code,200)
class FunctionTest(TestCase):
def test_function_returns_expected_result(self):
response = time_encode(10)
expected = "XYZ"
self.assertEqual(response, expected)
关于您对导入的评论:
from utils import time_encode
- 在上述导入之后你可以将其用作 time_encode
import utils
- 在上述导入之后你必须将它用作 utils.time_encode