Logo
Section 1 / 7

编写测试

学习在测试驱动开发中编写测试。

导入

编写测试

学习在测试驱动开发中编写测试。

TDD流程包含以下五个步骤:

  1. 编写测试。
  2. 运行测试。
  3. 编写实际代码。
  4. 使所有测试通过。
  5. 重构并优化代码。

在安装和配置好Django项目后,我们开始编写测试。在添加任何新功能或代码之前,必须先完成这一步。但在编写测试之前,我们需要全面理解整个应用的结构,包括需求、项目规范,以及我们即将实现的功能的具体目标。只有这样,编写的单元测试才能准确捕捉到所需的功能。

...
编写测试

这一流程非常有效。因为我们必须先写测试,这迫使我们在编码前深入思考需求。

这将为你节省未来的时间,因为项目从一开始就经过充分考虑,你清楚地知道功能的预期行为。

然而,这个测试最初是预期失败的,只有当功能实现满足规格要求时才会通过。这种情况通常出现在TDD流程后期,当我们编写实际代码时才会发生。

它是如何工作的?

作为开发者,我们必须主动思考要实现的功能规格。为了演示,假设我们要实现用户个人资料功能,例如展示某个用户的个人资料页面。此时,可以编写一个示例测试来验证返回的HTML内容是否符合预期:

1from django.test import SimpleTestCase 2from django.urls import reverse 3 4class TestUserProfile(SimpleTestCase): 5 def test_user_profile_contains_correct_html(self): 6 response = self.client.get(reverse('user')) 7 self.assertContains(response, 'Profile')

在此测试中,我们检查当访问名为 user 的URL路由时,返回的HTML页面是否包含关键词 Profile。我们使用 reverse 方法来获取该路由的URL。如果后续不小心修改了HTML内容并移除了 Profile 这个词,测试就会失败,从而及时提醒我们。

测试模板

我们还可以验证视图函数调用时实际使用的模板是否正确:

1from django.test import SimpleTestCase 2from django.urls import reverse 3 4class TestUserProfile(SimpleTestCase): 5 def test_user_profile_template(self): 6 response = self.client.get(reverse('user')) 7 self.assertTemplateUsed(response, 'user.html')

这里我们测试的是获取用户个人资料所使用的模板是否为 user.html。如果不是,则会触发错误。

测试URL

此处我们验证访问用户个人资料的 URL 是否返回 200 状态码,也就是页面能否正常响应。如果不是,则会触发错误。

1from django.test import SimpleTestCase 2from django.urls import reverse 3 4class TestUserProfile(SimpleTestCase): 5 def test_user_profile_code(self): 6 response = self.client.get(reverse('user')) 7 self.assertEqual(response.status_code, 200)

测试模型

在Django中,模型用于定义数据库中的表结构、字段及数据类型。我们可以按如下方式测试模型:

1from django.test import TestCase 2 3from .models import Profile 4 5class TestUserProfileModel(TestCase): 6 def test_create_user_profile(self): 7 self.profile = Profile.objects.create( 8 first_name = 'Samuel', 9 last_name = 'Torimiro', 10 ) 11 12 self.assertEqual(f'{self.profile.first_name}', 'Samuel') 13 self.assertEqual(f'{self.profile.last_name}', 'Torimiro')

这里我们创建了一个示例用户资料进行测试,并验证其内容是否正确。

注意: 上述所有测试都具有高度描述性,这对其他开发者理解每个测试的目的非常重要。

以上示例只是可能测试内容的起点,实际上还可以测试更多方面。但并非Django中的每一项功能都需要手动测试,因为Django自带的默认功能以及安装的第三方包均已包含自身的测试用例。因此,像Django管理后台这类功能无需额外测试。

简介

运行测试