在 Django 中,默认情况下,测试是无序执行的,即测试类的执行顺序是不确定的。然而,有时你可能希望强制按照特定顺序运行测试类,以确保测试的稳定性。在 Django 4.0 中,可以通过以下方式实现按顺序运行测试类:

1. 使用 unittest.TestLoader 自定义加载器:
   你可以创建一个自定义的测试加载器,覆盖 loadTestsFromTestCase 方法,并在其中对测试类进行排序。
   import unittest
   from django.test import TestCase

   class MyOrderedTests(TestCase):
       def test_one(self):
           self.assertEqual(1, 1)

       def test_two(self):
           self.assertEqual(2, 2)

   class MyOrderedTests2(TestCase):
       def test_three(self):
           self.assertEqual(3, 3)

       def test_four(self):
           self.assertEqual(4, 4)

   class OrderedTestLoader(unittest.TestLoader):
       def getTestCaseNames(self, testCaseClass):
           """Override to return test case names in desired order."""
           test_names = super().getTestCaseNames(testCaseClass)
           return sorted(test_names)

   class MyTestSuite(unittest.TestSuite):
       """Custom test suite that enforces order."""
       def __init__(self):
           loader = OrderedTestLoader()
           tests = loader.loadTestsFromTestCase(MyOrderedTests)
           self.addTests(tests)
           tests = loader.loadTestsFromTestCase(MyOrderedTests2)
           self.addTests(tests)

   if __name__ == '__main__':
       unittest.TextTestRunner().run(MyTestSuite())

   在这个例子中,OrderedTestLoader 会按照测试方法名的字母顺序对测试方法进行排序。你可以自定义排序逻辑以满足你的需求。

2. 使用 django.test.runner.DiscoverRunner:
   Django 提供了 django.test.runner.DiscoverRunner,它是 Django 默认的测试运行器。你可以自定义测试运行器,覆盖 get_test 方法来按顺序加载测试。
   from django.test import TestCase, SimpleTestCase, override_settings

   class OrderedDiscoverRunnerMixin:
       def build_suite(self, test_labels, extra_tests=None, **kwargs):
           suite = super().build_suite(test_labels, extra_tests, **kwargs)
           return self.sort_suite(suite)

       def sort_suite(self, suite):
           ordered_suite = []
           for test in suite:
               if isinstance(test, SimpleTestCase):
                   ordered_suite.append(test)
           return ordered_suite

   @override_settings(TEST_RUNNER='path.to.YourCustomDiscoverRunner')
   class MyOrderedTests(TestCase):
       def test_one(self):
           self.assertEqual(1, 1)

       def test_two(self):
           self.assertEqual(2, 2)

   @override_settings(TEST_RUNNER='path.to.YourCustomDiscoverRunner')
   class MyOrderedTests2(TestCase):
       def test_three(self):
           self.assertEqual(3, 3)

       def test_four(self):
           self.assertEqual(4, 4)

   在这个例子中,你需要替换 'path.to.YourCustomDiscoverRunner' 为包含你的自定义排序逻辑的测试运行器。

这些方法允许你自定义测试的加载顺序。请注意,依赖于测试类的执行顺序可能是不推荐的,因为测试应该是独立和可重复的。如果可能,尽量编写独立的测试,以便它们可以在任何顺序下运行。


转载请注明出处:http://www.pingtaimeng.com/article/detail/7287/Django