xugexuge 2019-02-16 15:03 采纳率: 100%
浏览 2501
已采纳

python3 unittest怎么做到上一个测试用例失败时自动跳过一下个测试用例

比如登录失败时,就跳过退出登录的用例,示例代码如下,大神求教,应该怎么写才能达到跳过的效果,如果使用@unittest.skipIf(),但是我怎么知道上个用例失败了呢

import unittest

class TestDemo(unittest.TestCase):

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

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

    def test_login(self):
        print("test_login")
        self.assertEqual(1, 2)  # 这里让登录判断为失败

    def test_logout(self):
        print("test_logout")

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

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

if __name__ == "__main__":
    testsuite = unittest.TestSuite()
    testsuite.addTest(TestDemo("test_login"))
    testsuite.addTest(TestDemo("test_logout"))
    runner = unittest.TextTestRunner()
    runner.run(testsuite)
  • 写回答

2条回答 默认 最新

  • xugexuge 2019-02-17 12:43
    关注

    我自己解决了哈哈哈,主要使用两个知识点,装饰器和 TestCase中的_outcome.result (python2中为_resultForDoCleanups),具体代码如下

    import unittest
    from functools import wraps
    
    
    def skip_dependon(depend=""):
        """
        :param depend: 依赖的用例函数名,默认为空
        :return: wraper_func
        """
        def wraper_func(test_func):
            @wraps(test_func)  # @wraps:避免被装饰函数自身的信息丢失
            def inner_func(self):
                if depend == test_func.__name__:
                    raise ValueError("{} cannot depend on itself".format(depend))
                # print("self._outcome", self._outcome.__dict__)
                # 此方法适用于python3.4 +
                # 如果是低版本的python3,请将self._outcome.result修改为self._outcomeForDoCleanups
                # 如果你是python2版本,请将self._outcome.result修改为self._resultForDoCleanups
                failures = str([fail[0] for fail in self._outcome.result.failures])
                errors = str([error[0] for error in self._outcome.result.errors])
                skipped = str([error[0] for error in self._outcome.result.skipped])
                flag = (depend in failures) or (depend in errors) or (depend in skipped)
                if failures.find(depend) != -1:
                    # 输出结果 [<__main__.TestDemo testMethod=test_login>]
                    # 如果依赖的用例名在failures中,则判定为失败,以下两种情况同理
                    # find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回 - 1
                    test = unittest.skipIf(flag, "{} failed".format(depend))(test_func)
                elif errors.find(depend) != -1:
                    test = unittest.skipIf(flag, "{} error".format(depend))(test_func)
                elif skipped.find(depend) != -1:
                    test = unittest.skipIf(flag, "{} skipped".format(depend))(test_func)
                else:
                    test = test_func
                return test(self)
            return inner_func
        return wraper_func
    
    
    class TestDemo(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls):
            print("setupclass")
    
        def setUp(self):
            print("setup")
    
        def test_login(self):
            print("test_login")
            self.assertEqual(1, 2)  # 这里让登录判断为失败
    
        @skip_dependon(depend="test_login")
        def test_logout(self):
            print("test_logout")
            self.assertEqual(1, 1)
    
        @skip_dependon(depend="test_logout")
        def test_1(self):
            print("test1")
    
        @skip_dependon(depend="test_1")
        def test_2(self):
            print("test2")
    
        def tearDown(self):
            print("teardown")
    
        @classmethod
        def tearDownClass(cls):
            print("teardownclass")
    
    if __name__ == '__main__':
        testsuite = unittest.TestSuite()
        testsuite.addTest(TestDemo("test_login"))
        testsuite.addTest(TestDemo("test_logout"))
        testsuite.addTest(TestDemo("test_1"))
        testsuite.addTest(TestDemo("test_2"))
        runner = unittest.TextTestRunner()
        runner.run(testsuite)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!