2014-12-27 3 views
2

지금 "ok"테스트 슈트가 있지만 개선하고 싶습니다. 무슨 일이 일어날지는 사용자, 부동산, 학교 및 도시 개체 설정 (예를 들어 모델을 제한)을 반복해야한다는 것입니다. (: 때문에 예를 단순화하기 위해 변경으로 나눌 수 수 있지만 논리가 난 후 무엇을 참고) : 여기 Django Modular Testing

작동 내가 지금 가지고있는 무언가의 예입니다

class MainTestSetup(TestCase): 
    def setUp(self): 
     self.manage_text = 'Manage' 

     User = get_user_model() 

     # set up all types of users to be used 
     self.staff_user = User.objects.create_user('staff_user', '[email protected]', 'testpassword') 
     self.staff_user.is_staff = True 
     self.staff_user.save() 

     self.user = User.objects.create_user('user', '[email protected]', 'testpassword') 

     self.city = City.objects.create(name="Test Town", state="TX") 
     self.school = School.objects.create(city=self.city, name="RE Test University", 
         long=-97.1234123, lat=45.78) 
     self.company = Company.objects.create(name="Test Company", default_school=self.school) 

    def login(self): 
     self.client.login(username=self.user.username, 
      password='testpassword') 

    def login_admin(self): 
     self.client.login(username=self.staff_user, password="testpassword") 


class MainViewTests(MainTestSetup): 
    def test_home(self): 
     url = reverse('home-list') 
     manage_url = reverse('manage-property') 

     anon_response = self.client.get(url) 
     self.assertEqual(anon_response.status_code, 200) 
     self.assertNotContains(anon_response, self.manage_text) 

     self.login_admin() 
     admin_response = self.client.get(url) 
     self.assertContains(admin_response, self.manage_text) 

    def test_search(self): 
     url = reverse('search') 
     response = self.client.get(url) 
     self.assertEqual(response.status_code, 200) 

    ...more tests 

로 MainViewTest가 MainTestSetup 클래스에서 setUp 및 login 함수를 상속받는 것을 볼 수 있습니다. 이 작동하지만, 많은 애플 리케이션이 모든 모든 모델을 설정할 필요가 없습니다. 제가 시도한 것은 사용자, 학교, 회사와 같은 것들을 포함하는 믹스 인 세트를 필요한 TestSetups에만 설정하는 것입니다. 내 테스트 스위트에 대한 더 많은 유연성을 허용 할

class SchoolMixin(object): 
    def setUp(self): 
     self.city = City.objects.create(name="Test Town", state="TX") 
     self.school = School.objects.create(city=self.city, name="RE Test University", 
         long=-97.1234123, lat=45.78) 


class CompanyMixin(SchoolMixin): 
    def setUp(self): 
     self.company = Company.objects.create(name="Test Company", default_school=self.school) 


class UserMixin(object): 
    def setUp(self): 
     User = get_user_model() 

     # set up all types of users to be used 
     self.staff_user = User.objects.create_user('staff_user', '[email protected]', 'testpassword') 
     self.staff_user.is_staff = True 
     self.staff_user.save() 

     self.user = User.objects.create_user('user', '[email protected]', 'testpassword') 

    def login(self): 
     self.client.login(username=self.user.username, 
      password='testpassword') 

    def login_admin(self): 
     self.client.login(username=self.staff_user, password="testpassword") 


class MainTestSetup(UserMixin, CompanyMixin, TestCase): 
    def setUp(self): 
     self.manage_text = 'Manage' 

이 -이 단지 작은 예입니다

이 MainTestSetup 같은 무언가로 설정합니다. 다른 앱에서 필자에게 필요한 Mixins 만 포함시킬 수 있습니다. 예를 들어 회사가 필요하지 않은 경우 위의 예에서 SchoolMixin 만 포함합니다.

여기 내 문제는 setUp 함수의 상속과 관련이 있다고 생각합니다. 나는 올바르게 상속하는 방법을 잘 모르겠다. (슈퍼를 통해, 또는 다른 것을 통해서?). 나는 슈퍼를 사용해 보았지만 작동시키지 못했습니다. 나는 클래스/믹스 니스에 대해서는별로 좋지 않다는 것을 인정해야한다. 그래서 도움이나 조언을 많이 주시면 감사하겠습니다.

+1

그것은 (물론, 지점) 효율적이거나 유연보다 더 간단한 단위 테스트를 유지하는 것이 더 중요 : 여기

는 공장을 사용하여 테스트의 전체 정말 간단한 예제 당신은 py.test fixtures (http://pytest.org/latest/fixture.html)와 비슷한 것을 성취하려고합니다. 장고와 함께 py.test를 사용하고 싶다면 pytest-django (http://pytest-django.readthedocs.org/en/latest/index.html)를 사용해 보시기 바랍니다. – thebjorn

답변

3

2 개의 라이브러리 WebTest 및 FactoryBoy를 사용하여 코드를 단순화하고 줄일 수 있습니다. 이 믹스 인은 필요하지 않습니다.

    https://github.com/rbarrois/factory_boy

  • https://pypi.python.org/pypi/django-webtest
  • 단계로 변화 단계를 수행하십시오 (당신의 login_ 방법 제거 할 수 있도록 WebTest에와

    1 시작을 당신은하지 않습니다 암호도 준비해야 함). WebTest를 사용하면 페이지를로드 할 때 로그인 한 사용자를 지정할 수 있습니다. 예를 들어 당신은 대체합니다 :

    self.login_admin() 
    admin_response = self.client.get(url) 
    

    로 :

    admin_response = = self.app.get(url, user=self.admin) 
    

    2 그런 다음 당신이 필요로하는 모든 개체를 만들 factory_boy를 사용합니다. 예를 들어 당신은 대체합니다 :

    self.staff_user = User.objects.create_user('staff_user', '[email protected]', 'testpassword') 
        self.staff_user.is_staff = True 
        self.staff_user.save() 
    

    로 :

    self.staff_user = StaffFactory.create() 
    

    3.가 그것을 섞는다. self.admin을 제거하십시오. 다음 코드로 바꿉니다 :

    admin = AdminFactory.create() 
        response = = self.app.get(url, user=admin) 
    

    모든 작업을 완료하면 코드가 훨씬 짧아지고 읽기 쉽습니다.이 믹스 인은 전혀 필요 없습니다. 예를 들어 당신의 SchoolMixin은 다음과 같이 교체 할 수 있습니다 : 공장이 자동으로 생성 "SubFactories"로 엔티티를 관련 수 있기 때문이다

    school = SchoolFactory.create() 
    

    :

    self.city = City.objects.create(name="Test Town", state="TX") 
        self.school = School.objects.create(city=self.city, name="RE Test University", 
            long=-97.1234123, lat=45.78) 
    

    로 대체. 그것은 같은 소리 말했다되고 있다는 http://codeku.co/testing-in-django-1

  • +0

    아름답고, 내가 찾던 것을 정확하게. 감사 – awwester