Правильно ли я тестирую приложение? - Python

Узнай цену своей работы

Формулировка задачи:

Первое моё TDD приложение. Тест тоже отрабатывает верно. Если в моделях я уверен, то насчет тестов нет. Мои вопросы: 1) Нужно при каждом тесте создавать данные и сохранять их, как я здесь сделал? 2) Не слишком ли тестовые классы взаимосвязаны? Мне пришлось создавать статические конструкторы, потому что тестирование проекта без создания остальных объектов было бы невозможно. 3) Соблюдены ли общие правила создания тестов? 4) Нужно ли вручную уничтожать созданные в ходе тестов объекты? Единственный тест расположен в функции test_get_root_tasks Тесты
Листинг программы
  1. from django.test import TestCase
  2. from django.utils import timezone
  3. from .models import Task, Project, Chief
  4. class TaskMethodTests(TestCase):
  5. @staticmethod
  6. def create_test_tasks():
  7. task_array = []
  8. for i in range(0, 10):
  9. task_array.append(Task.objects.create(name='task ' + str(i), description='wow, task ' + str(i) + '!',
  10. start_date=timezone.now(), end_date=timezone.now()))
  11. return task_array
  12. @staticmethod
  13. def destroy_test_tasks(task_array):
  14. for t in task_array:
  15. t.delete()
  16.  
  17. class ProjectMethodTests(TestCase):
  18. @staticmethod
  19. def create_test_project():
  20. return Project.objects.create(name='test proj', description="wow, such test",
  21. start_date=timezone.now(), end_date=timezone.now(),
  22. chief=ChiefMethodTests.create_test_chief())
  23. def test_get_root_tasks(self):
  24. project = ProjectMethodTests.create_test_project()
  25. task_array = TaskMethodTests.create_test_tasks()
  26. # подчинить все задания первому заданию
  27. for i in range(1, 10):
  28. task_array[i].parent_task = task_array[0]
  29. # присвоить все задания проекту
  30. for i in range(0, 10):
  31. task_array[i].project = project
  32. root_tasks = project.get_root_tasks()
  33. #проверить, вернулось ли что-нибудь вообще
  34. self.assertNotEqual(root_tasks.count(), 0)
  35. for task in root_tasks:
  36. self.assertEqual(task.parent_task, None)
  37.  
  38. class ChiefMethodTests(TestCase):
  39. @staticmethod
  40. def create_test_chief():
  41. return Chief.objects.create(surname="test chief", dob=timezone.now(),
  42. email="")
Модели
Листинг программы
  1. from django.db import models
  2. # Create your models here.
  3.  
  4. class Skill(models.Model):
  5. name = models.CharField(max_length=20)
  6. description = models.TextField(max_length=200)
  7. def __str__(self):
  8. return self.name
  9.  
  10. class Faculty(models.Model):
  11. name = models.CharField(max_length=20)
  12. description = models.TextField(max_length=200)
  13. def __str__(self):
  14. return self.name
  15.  
  16. class Major(models.Model):
  17. name = models.CharField(max_length=20)
  18. description = models.TextField(max_length=200)
  19. faculty = models.ForeignKey(Faculty)
  20. def __str__(self):
  21. return self.name
  22.  
  23. class Person(models.Model):
  24. personal_name = models.CharField(max_length=40)
  25. patronymic_name = models.CharField(max_length=40)
  26. surname = models.CharField(max_length=40)
  27. dob = models.DateField()
  28. email = models.EmailField()
  29. class Meta:
  30. abstract = True
  31. def __str__(self):
  32. return self.surname + " " + self.personal_name + " " + self.patronymic_name
  33.  
  34. class Student(Person):
  35. faculty = models.ForeignKey(Faculty)
  36. major = models.ForeignKey(Major)
  37. skills = models.ManyToManyField(Skill)
  38.  
  39. class Chief(Person):
  40. additional_info = models.TextField(max_length=200)
  41.  
  42. class Project(models.Model):
  43. name = models.CharField(max_length=30)
  44. description = models.TextField(max_length=200)
  45. start_date = models.DateField()
  46. end_date = models.DateField()
  47. students = models.ManyToManyField(Student)
  48. chief = models.ForeignKey(Chief)
  49. def __str__(self):
  50. return self.name
  51. def get_root_tasks(self):
  52. return Task.objects.filter(pk=self.pk, parent_task__isnull=True)
  53.  
  54. class Task(models.Model):
  55. name = models.CharField(max_length=20)
  56. description = models.TextField(max_length=200, blank=True)
  57. project = models.ForeignKey(Project, default=0)
  58. start_date = models.DateField()
  59. end_date = models.DateField()
  60. parent_task = models.ForeignKey('self', null=True, blank=True)
  61. def __str__(self):
  62. return self.name

Решение задачи: «Правильно ли я тестирую приложение?»

textual
Листинг программы
  1. from django.test import TestCase
  2. from django.utils import timezone
  3. from .models import Task, Project, Chief
  4.  
  5. class MyTest(TestCase):
  6.  
  7.     def setUp(self):
  8.  
  9.         now = timezone.now()
  10.  
  11.         self.chief = ChiefMethodTests.objects.create(
  12.             surname="test chief",
  13.             dob=now,
  14.             email="")
  15.  
  16.         self.project = Project.objects.create(
  17.             name='test proj',
  18.             description="wow, such test",
  19.             start_date=now,
  20.             end_date=now,
  21.             chief=self.chief)
  22.  
  23.         self.root_task = Task.objects.create(
  24.                 name='task 0',
  25.                 description='wow, task 0!',
  26.                 start_date=now,
  27.                 end_date=now,
  28.                 project=self.project)
  29.  
  30.         self.task_array = [
  31.             Task.objects.create(
  32.                 name='task {0}'.format(i),
  33.                 description='wow, task {0}!'.format(i),
  34.                 start_date=now,
  35.                 end_date=now,
  36.                 project=self.project,
  37.                 parent_task=self.root_task)
  38.             for i in xrange(1, 10)]
  39.  
  40.     def test_get_root_tasks(self):
  41.  
  42.         root_tasks = self.project.get_root_tasks()
  43.  
  44.         #проверить, вернулось ли что-нибудь вообще
  45.         self.assertNotEqual(root_tasks.count(), 0)
  46.  
  47.         for task in root_tasks:
  48.             self.assertEqual(task.parent_task, None)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут