简短介绍。
我只是在学习为应用程序编写测试。该应用程序是在线成绩簿。
以下是主页视图测试中的代码。只有登录表单。如果用户是首次登录,则将其重定向到强制更改默认密码的视图。如果是下一次登录,则根据用户权限将其重定向到正确的视图。
问题。
在此视图测试中,我必须创建6个用户和相关模型(学生,父母,教师),因此我编写了创建这些对象的方法( create_user / create_person >)。
在将来的许多视图测试中,我还必须登录用户并使用模型(学生,家长,教师)。
我应该如何重复这些步骤?我想到两种方式。
1.将方法转换为静态方法,并在下一个测试类中使用它们来创建对象。测试是否仍将是“统一的”?
2.将方法定义复制到将需要它们的每个下一个测试类。这不会违反DRY原则吗?
哪种方法好?
class HomepageViewTestCase(TestCase):
password = 'testerspass'
def create_user(self):
username = 'tester'
numbering = 0
while True:
try:
User.objects.get(username=username)
numbering += 1
username += str(numbering)
except User.DoesNotExist:
return User.objects.create_user(
username=username, password=self.password,
first_name='Name', last_name='Surname')
def create_person(self, kind):
content_type = ContentType.objects.get_for_model(RightsSupport)
permission = Permission.objects.get(content_type=content_type,
codename=kind)
if kind in {'student', 'parent'}:
user = self.create_user()
user.user_permissions.add(permission)
try:
school_class = SchoolClass.objects.get(unique_code='2a2020')
except SchoolClass.DoesNotExist:
school_class = SchoolClass.objects.create(unique_code='2a2020',
name='2a', year=2020)
student = Student.objects.create(user=user,
school_class=school_class,
name=user.first_name,
surname=user.last_name,
birthday='2010-03-29')
if kind == 'student':
return student
if kind == 'parent':
user = self.create_user()
user.user_permissions.add(permission)
return Parent.objects.create(user=user, student=student,
name=user.first_name,
surname=user.last_name)
if kind == 'teacher':
user = self.create_user()
user.user_permissions.add(permission)
return Teacher.objects.create(user=user, name=user.first_name,
surname=user.last_name)
def setUp(self):
# Create users and student/parent/teacher models objects to test login
# by homepage
self.student_1 = self.create_person('student')
self.student_1_form_data = {'username': self.student_1.user.username,
'password': self.password}
self.student_2 = self.create_person('student')
self.student_2.first_login = False
self.student_2.save()
self.student_2_form_data = {'username': self.student_2.user.username,
'password': self.password}
self.parent_1 = self.create_person('parent')
self.parent_1_form_data = {'username': self.parent_1.user.username,
'password': self.password}
self.parent_2 = self.create_person('parent')
self.parent_2.first_login = False
self.parent_2.save()
self.parent_2_form_data = {'username': self.parent_2.user.username,
'password': self.password}
self.teacher_1 = self.create_person('teacher')
self.teacher_1_form_data = {'username': self.teacher_1.user.username,
'password': self.password}
self.teacher_2 = self.create_person('teacher')
self.teacher_2.first_login = False
self.teacher_2.save()
self.teacher_2_form_data = {'username': self.teacher_2.user.username,
'password': self.password}
def test_homepage_view(self):
response = Client().get(reverse('yourgrades:homepage'))
self.assertEqual(response.status_code, 200)
# Post with clean form or with wrong data -> not redirects
response = Client().post(reverse('yourgrades:homepage'))
self.assertEqual(response.status_code, 200)
response = Client().post(reverse('yourgrades:homepage'),
{'username': 'tester',
'password': 'wrongpass'})
self.assertEqual(response.status_code, 200)
# Student redirection tests
# if first_login field is True -> redirects to FirstLoginView
self.assertTrue(LoginForm(self.student_1_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.student_1_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.student_1_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/firstlogin')
# if first_login field is False, redirects to StudentParentView
self.assertTrue(LoginForm(self.student_2_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.student_2_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.student_2_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/studentparent')
self.assertTemplateUsed(response, 'yourgrades/studentparent.html')
# Parent redirection tests
# if first_login field is True, redirects to FirstLoginView
self.assertTrue(LoginForm(self.parent_1_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.parent_1_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.parent_1_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/firstlogin')
# if first_login field is False, redirects to StudentParentView
self.assertTrue(LoginForm(self.parent_2_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.parent_2_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.parent_2_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/studentparent')
self.assertTemplateUsed(response, 'yourgrades/studentparent.html')
# Teacher redirection tests
# if first_login field is True, redirects to FirstLoginView
self.assertTrue(LoginForm(self.teacher_1_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.teacher_1_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.teacher_1_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/firstlogin')
# if first_login field is False, redirects to TeacherPanelView
self.assertTrue(LoginForm(self.teacher_2_form_data).is_valid())
response = Client().post(reverse('yourgrades:homepage'),
self.teacher_2_form_data, )
self.assertEqual(response.status_code, 302)
response = Client().post(reverse('yourgrades:homepage'),
self.teacher_2_form_data, follow=True)
self.assertRedirects(response, '/yourgrades/teacher')
self.assertTemplateUsed(response, 'yourgrades/teacher.html')```