【问题标题】:How to customize python unittest order如何自定义python单元测试顺序
【发布时间】:2022-01-15 18:06:33
【问题描述】:

需要一个方法来按测试用例定义顺序运行unittest,但是找了很久没有可用的方法。

例如,有多个关于声音的测试,其中两个是test_AiSound_stream01 & test_AiSound_stream02。然后我们发现AiSound本身可能效果不好,所以再添加一个测试test_AiSound_feasibility。这两个测试只有在第三个通过时才会运行,否则它们将被跳过(或设置为错误)。

我希望第三个显示 AiSound 功能当前是否正常。而另外两个,我想测试一些特定流的播放能力。

最后我想出了一个主意,把它放在这里,以防万一可能需要相同答案的人。
如果有更好的方法,请分享。

【问题讨论】:

  • 更好的方法是不依赖于测试运行的顺序,因为这表明它们不是独立的。
  • 感谢您的意见。我知道如果我们可以以随机顺序运行所有单元测试会更好。但有时在特殊情况下,我只需要按特定顺序运行测试即可。
  • 如果你有实际的上下文,人们可能会想出一个适当的解决方案,而不是解决 XY 问题。
  • 考虑有十个测试用例,然后我添加一个测试,十个测试中的两个只有在新测试可以通过时才运行。我想到了有条件的跳过,但我只需要考虑测试顺序。我的领导认为将测试命名为test_01_xxxtest_02_xxx 是个坏主意。所以我只需要一个方法来自定义测试顺序。
  • 请原谅我对单元测试知识的贫乏,我更擅长JUnit 测试,刚接触unittest

标签: unit-testing python-unittest


【解决方案1】:

以下代码显示了如何按定义顺序运行测试用例:

import unittest
import inspect


def cmp(a, b):
    return (a > b) - (a < b)


def get_line_no(method_name_str):
    return inspect.getsourcelines(getattr(OrderTest, method_name_str))[1]


# noinspection PyUnusedLocal
def reorder(self, x, y):
    return cmp(get_line_no(x), get_line_no(y))


unittest.TestLoader.sortTestMethodsUsing = reorder


# noinspection PyMethodMayBeStatic
class OrderTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

    def setUp(self):
        print("setUp")

    def tearDown(self):
        print("tearDown")

    def test_2_test(self):
        print("test_2_test")

    def test_3_test(self):
        print("test_3_test")

    def test_0_test(self):
        print("test_0_test")

    def test_first_test(self):
        print("test_first_test")

    def test_last_test(self):
        print("test_last_test")

    def test_unknown_test(self):
        print("test_unknown_test")
$ python3 -m pytest -s main.py -vv
=============================================================================================== test session starts =============================================================================================== platform win32 -- Python 3.7.3, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- C:\Python37\python3.exe
cachedir: .pytest_cache
rootdir: D:\PythonProject\UnitTest
collecting ...
collected 6 items

main.py::OrderTest::test_2_test setUpClass
setUp
test_2_test
tearDown
PASSED
main.py::OrderTest::test_3_test setUp
test_3_test
tearDown
PASSED
main.py::OrderTest::test_0_test setUp
test_0_test
tearDown
PASSED
main.py::OrderTest::test_first_test setUp
test_first_test
tearDown
PASSED
main.py::OrderTest::test_last_test setUp
test_last_test
tearDown
PASSED
main.py::OrderTest::test_unknown_test setUp
test_unknown_test
tearDown
PASSEDtearDownClass

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2011-05-04
    • 2011-11-05
    • 1970-01-01
    • 2018-02-25
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多