为何Django中setUpTestData带参数而setUp不带?
Django测试:setUpTestData的cls参数与setUp的区别
核心原因:方法类型不同
setUpTestData 是类方法,而 setUp 是实例方法,这就是两者参数不同的根本原因:
- 类方法调用时,Python 会自动把测试类本身作为第一个参数传递,这个参数约定俗成叫
cls,作用和普通类方法里的 cls 一致——用来访问和修改类级别的属性。 - 实例方法(比如 setUp)绑定到测试类的实例上,每个测试用例执行前,Django 都会创建全新的测试类实例,Python 会把当前实例作为第一个参数传递(也就是
self)。
cls参数的具体作用
setUpTestData 仅在测试类初始化时执行一次,cls 用来把共享数据绑定到测试类上,让所有测试用例(每个用例对应一个实例)都能复用这些数据:
比如在 setUpTestData 里创建测试用户:
@classmethod def setUpTestData(cls): cls.test_user = User.objects.create_user(username="test", password="123")
之后所有测试方法里,不管通过 self.test_user(实例会继承类属性)还是 cls.test_user,都能访问这个只创建过一次的用户对象,避免每个测试用例重复创建相同数据,提升测试效率。
为什么setUp不需要cls?
setUp 是每个测试用例执行前都会运行的实例方法,作用是为当前测试实例准备隔离的测试数据。每个测试用例的实例都是独立的,所以用 self 操作当前实例的属性,保证不同测试用例的数据不会互相干扰。比如在 setUp 里创建的临时对象,每个测试用例都会重新生成一份,测试结束后独立销毁。
举个完整代码例子更直观:
from django.test import TestCase from django.contrib.auth.models import User class UserTest(TestCase): @classmethod def setUpTestData(cls): # 类级数据,仅创建一次 cls.permanent_user = User.objects.create_user(username="perm_user", password="123") def setUp(self): # 实例级数据,每个测试用例都重新创建 self.temp_user = User.objects.create_user(username="temp_user", password="456") def test_permanent_user(self): # 所有测试用例共用同一个permanent_user self.assertEqual(self.permanent_user.username, "perm_user") def test_temp_user(self): # 每个测试用例的temp_user都是新的,互不影响 self.assertEqual(self.temp_user.username, "temp_user")
内容的提问来源于stack exchange,提问作者diksown
相关产品推荐
相关产品推荐

