Правильно ли я тестирую приложение? - Python
Формулировка задачи:
Первое моё TDD приложение. Тест тоже отрабатывает верно. Если в моделях я уверен, то насчет тестов нет. Мои вопросы:
1) Нужно при каждом тесте создавать данные и сохранять их, как я здесь сделал?
2) Не слишком ли тестовые классы взаимосвязаны? Мне пришлось создавать статические конструкторы, потому что тестирование проекта без создания остальных объектов было бы невозможно.
3) Соблюдены ли общие правила создания тестов?
4) Нужно ли вручную уничтожать созданные в ходе тестов объекты?
Единственный тест расположен в функции test_get_root_tasks
Тесты
Модели
Листинг программы
- from django.test import TestCase
- from django.utils import timezone
- from .models import Task, Project, Chief
- class TaskMethodTests(TestCase):
- @staticmethod
- def create_test_tasks():
- task_array = []
- for i in range(0, 10):
- task_array.append(Task.objects.create(name='task ' + str(i), description='wow, task ' + str(i) + '!',
- start_date=timezone.now(), end_date=timezone.now()))
- return task_array
- @staticmethod
- def destroy_test_tasks(task_array):
- for t in task_array:
- t.delete()
- class ProjectMethodTests(TestCase):
- @staticmethod
- def create_test_project():
- return Project.objects.create(name='test proj', description="wow, such test",
- start_date=timezone.now(), end_date=timezone.now(),
- chief=ChiefMethodTests.create_test_chief())
- def test_get_root_tasks(self):
- project = ProjectMethodTests.create_test_project()
- task_array = TaskMethodTests.create_test_tasks()
- # подчинить все задания первому заданию
- for i in range(1, 10):
- task_array[i].parent_task = task_array[0]
- # присвоить все задания проекту
- for i in range(0, 10):
- task_array[i].project = project
- root_tasks = project.get_root_tasks()
- #проверить, вернулось ли что-нибудь вообще
- self.assertNotEqual(root_tasks.count(), 0)
- for task in root_tasks:
- self.assertEqual(task.parent_task, None)
- class ChiefMethodTests(TestCase):
- @staticmethod
- def create_test_chief():
- return Chief.objects.create(surname="test chief", dob=timezone.now(),
- email="")
Листинг программы
- from django.db import models
- # Create your models here.
- class Skill(models.Model):
- name = models.CharField(max_length=20)
- description = models.TextField(max_length=200)
- def __str__(self):
- return self.name
- class Faculty(models.Model):
- name = models.CharField(max_length=20)
- description = models.TextField(max_length=200)
- def __str__(self):
- return self.name
- class Major(models.Model):
- name = models.CharField(max_length=20)
- description = models.TextField(max_length=200)
- faculty = models.ForeignKey(Faculty)
- def __str__(self):
- return self.name
- class Person(models.Model):
- personal_name = models.CharField(max_length=40)
- patronymic_name = models.CharField(max_length=40)
- surname = models.CharField(max_length=40)
- dob = models.DateField()
- email = models.EmailField()
- class Meta:
- abstract = True
- def __str__(self):
- return self.surname + " " + self.personal_name + " " + self.patronymic_name
- class Student(Person):
- faculty = models.ForeignKey(Faculty)
- major = models.ForeignKey(Major)
- skills = models.ManyToManyField(Skill)
- class Chief(Person):
- additional_info = models.TextField(max_length=200)
- class Project(models.Model):
- name = models.CharField(max_length=30)
- description = models.TextField(max_length=200)
- start_date = models.DateField()
- end_date = models.DateField()
- students = models.ManyToManyField(Student)
- chief = models.ForeignKey(Chief)
- def __str__(self):
- return self.name
- def get_root_tasks(self):
- return Task.objects.filter(pk=self.pk, parent_task__isnull=True)
- class Task(models.Model):
- name = models.CharField(max_length=20)
- description = models.TextField(max_length=200, blank=True)
- project = models.ForeignKey(Project, default=0)
- start_date = models.DateField()
- end_date = models.DateField()
- parent_task = models.ForeignKey('self', null=True, blank=True)
- def __str__(self):
- return self.name
Решение задачи: «Правильно ли я тестирую приложение?»
textual
Листинг программы
- from django.test import TestCase
- from django.utils import timezone
- from .models import Task, Project, Chief
- class MyTest(TestCase):
- def setUp(self):
- now = timezone.now()
- self.chief = ChiefMethodTests.objects.create(
- surname="test chief",
- dob=now,
- email="")
- self.project = Project.objects.create(
- name='test proj',
- description="wow, such test",
- start_date=now,
- end_date=now,
- chief=self.chief)
- self.root_task = Task.objects.create(
- name='task 0',
- description='wow, task 0!',
- start_date=now,
- end_date=now,
- project=self.project)
- self.task_array = [
- Task.objects.create(
- name='task {0}'.format(i),
- description='wow, task {0}!'.format(i),
- start_date=now,
- end_date=now,
- project=self.project,
- parent_task=self.root_task)
- for i in xrange(1, 10)]
- def test_get_root_tasks(self):
- root_tasks = self.project.get_root_tasks()
- #проверить, вернулось ли что-нибудь вообще
- self.assertNotEqual(root_tasks.count(), 0)
- for task in root_tasks:
- self.assertEqual(task.parent_task, None)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д