【问题标题】:python unittest count testspython unittest 计数测试
【发布时间】:2015-02-13 13:04:18
【问题描述】:

是否有可能使用 unittest 来计算跳过测试的总测试数和运行次数。并且在运行后测试失败的次数(我知道它可以在输出中看到)。如果我以编程方式接受它,我想将它转储到 json 中,那会很棒

非常感谢

【问题讨论】:

  • 到目前为止你有什么尝试?请在此处阅读:stackoverflow.com/help/how-to-ask
  • 刚刚尝试了 unittest 的发现功能,但无法确定哪些测试已被跳过

标签: python python-unittest


【解决方案1】:

经过多次尝试和错误,我终于得到了这个工作......

基于scoffey's answer

希望对你有帮助。

import unittest

class MyTest(unittest.TestCase):

    currentResult = None # holds last result object passed to run method

    @classmethod
    def setResult(cls, amount, errors, failures, skipped):
        cls.amount, cls.errors, cls.failures, cls.skipped = \
            amount, errors, failures, skipped

    def tearDown(self):
        amount = self.currentResult.testsRun
        errors = self.currentResult.errors
        failures = self.currentResult.failures
        skipped = self.currentResult.skipped
        self.setResult(amount, errors, failures, skipped)

    @classmethod
    def tearDownClass(cls):
        print("\ntests run: " + str(cls.amount))
        print("errors: " + str(len(cls.errors)))
        print("failures: " + str(len(cls.failures)))
        print("success: " + str(cls.amount - len(cls.errors) - len(cls.failures)))
        print("skipped: " + str(len(cls.skipped)))

    def run(self, result=None):
        self.currentResult = result # remember result for use in tearDown
        unittest.TestCase.run(self, result) # call superclass run method

    def testA(self):
        self.assertTrue(True) # succeeds

    def testB(self):
        self.assertTrue(False) # fails

    def testC(self):
        self.assertTrue(1 + None is None) # raises TypeError

    @unittest.skip("skip it") # skipped
    def testD(self):
        self.assertTrue("whatever")

if __name__ == '__main__':
    unittest.main() 

运行脚本

python test.py > result.txt

结果.txt:

tests run: 3
errors: 1
failures: 1
success: 1
skipped: 1

我不确定这是不是最好的方法,但它确实有效。 Unittest 模块好用难精通,现在感觉自己对它知之甚少。

【讨论】:

【解决方案2】:

我使用单元测试 TestSuite (Ref)。

在运行后返回一个 TextTestResult,其中包含一个包含失败、错误和跳过的列表,一个包含 Test_runs 的值等等。

这是一个“最低限度”的工作示例,说明我将如何做到这一点。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import unittest


class TestDummy(unittest.TestCase):
    """A Dummy UnitTesting class."""

    def test_failure(self):
        """Fails on test."""
        self.fail(msg="Need a failure")

    @unittest.skip("Need a Skipper")
    def test_skipping(self):
        """Skippes on test."""
        pass

    def test_error(self):
        """Gives a error on test."""
        self.not_a_thing()

    def test_pass(self):
        """Need a test that passes."""
        pass


def warp_test_suite(testcase_class):
    """Load tests from a specific set of TestCase classes."""
    suite = unittest.TestSuite()
    tests = unittest.defaultTestLoader.loadTestsFromTestCase(testcase_class)
    suite.addTest(tests)
    return suite


if __name__ == "__main__":
    import json  # For saving a JSON-file

    # The test results dictionary, for the JSON.
    result_value = {"Failures": 0, "Errors": 0, "Skipped": 0, "Test Runs": 0}

    # Setup and run the Test
    runner = unittest.TextTestRunner()
    TextTestResult = runner.run(warp_test_suite(TestDummy))

    # Passes the Result
    result_value["Failures"] += len(TextTestResult.failures)
    result_value["Errors"] += len(TextTestResult.errors)
    result_value["Skipped"] += len(TextTestResult.skipped)
    result_value["Test Runs"] += TextTestResult.testsRun

    # Save the result to a JSON-file.
    with open("result_data.json", 'w') as fp:
            json.dump(result_value, fp, indent=3)

【讨论】:

    【解决方案3】:

    我不知道 unittest 以 JSON 格式报告的任何方式。我知道nose 正在以 XML 格式输出结果:

    nosetests --with-xunit --xunit-file=mytests.xml mytests.py
    

    以下是此 XML 文件的摘录:

    <testsuite name="nosetests" tests="3" errors="0" failures="1" skip="1">
    

    如果您不介意 XML 格式,那么这是一个可以考虑的解决方案。也听说nose有个JSON插件,还没玩过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多