Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django setUpTestData() vs. setUp()

Django 1.8 shipped with a refactored TestCase which allows for data initialization at the class level using transactions and savepoints via the setUpTestData() method. This is in contrast to unittest's setUp() which runs before every single test method.

Question: What is the use case for setUp() in Django now that setUpTestData() exists?

I'm looking for objective, high-level answers only, as otherwise this question would be too broad for Stack Overflow.

like image 315
rnevius Avatar asked Apr 03 '15 08:04

rnevius


People also ask

Does setUp run before every test Django?

setUp() runs before each individual test. setUpClass() runs before each test case.

Which one of the following is the most common class used for writing tests in Django?

TestCase. This is the most common class to use for writing tests in Django. It inherits from TransactionTestCase (and by extension SimpleTestCase ).

What is self client in Django?

self. client , is the built-in Django test client. This isn't a real browser, and doesn't even make real requests. It just constructs a Django HttpRequest object and passes it through the request/response process - middleware, URL resolver, view, template - and returns whatever Django produces.

How do I skip a Django test?

Just trick it to always skip with the argument True : @skipIf(True, "I don't want to run this test yet") def test_something(): ... If you are looking to simply not run certain test files, the best way is probably to use fab or other tool and run particular tests.


1 Answers

It's not uncommon for there to be set-up code that can't run as a class method. One notable example is the Django test client: you might not want to reuse the same client instance across tests that otherwise share much of the same data, and indeed, the client instances automatically included in subclasses of Django's SimpleTestCase are created per test method rather than for the entire class. Suppose you had a test from the pre-Django 1.8 world with a setUp method like this:

     def setUp(self):         self.the_user = f.UserFactory.create()         self.the_post = f.PostFactory.create(author=self.the_user)         self.client.login(             username=self.the_user.username, password=TEST_PASSWORD         )         # ... &c.  

You might tempted to modernize the test case by changing setUp to setUpTestData, slapping a @classmethod decorator on top, and changing all the selfs to cls. But that will fail with a AttributeError: type object 'MyTestCase' has no attribute 'client'! Instead, you should use setUpTestData for the shared data and setUp for the per-test-method client:

     @classmethod     def setUpTestData(cls):         cls.the_user = f.UserFactory.create()         cls.the_post = f.PostFactory.create(author=cls.the_user)         # ... &c.      def setUp(self):         self.client.login(             username=self.the_user.username, password=TEST_PASSWORD         ) 

Note: if you are wondering what that variable f is doing in the example code, it comes from factoryboy - a useful fixtures library for creating objects for your tests.

like image 153
Zack M. Davis Avatar answered Sep 19 '22 12:09

Zack M. Davis