python unittest 计数测试
python unittest count tests
unittest 是否可以有一个选项来计算跳过测试的总测试数和 运行 的数量。在 运行 之后,测试失败的次数(我知道可以在输出中看到)。如果我想以编程方式使用它,我想将它转储到 json 中,那会很棒
非常感谢
我不知道 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插件,但是还没玩过
经过多次试验和错误,我终于让这个工作...
基于 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
result.txt:
tests run: 3
errors: 1
failures: 1
success: 1
skipped: 1
我不确定这是最好的方法,但它确实有效。 unittest模块好用难精,现在感觉自己知之甚少
我使用单元测试 TestSuite (Ref)。
在 运行 之后,它 returns 一个 TextTestResult,其中包含一个包含失败、错误和已跳过的列表,一个包含 Test_runs 的值,等等。
这里有一个 "minimum" 工作示例,说明我将如何做。
#!/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)
unittest 是否可以有一个选项来计算跳过测试的总测试数和 运行 的数量。在 运行 之后,测试失败的次数(我知道可以在输出中看到)。如果我想以编程方式使用它,我想将它转储到 json 中,那会很棒
非常感谢
我不知道 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插件,但是还没玩过
经过多次试验和错误,我终于让这个工作...
基于 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
result.txt:
tests run: 3
errors: 1
failures: 1
success: 1
skipped: 1
我不确定这是最好的方法,但它确实有效。 unittest模块好用难精,现在感觉自己知之甚少
我使用单元测试 TestSuite (Ref)。
在 运行 之后,它 returns 一个 TextTestResult,其中包含一个包含失败、错误和已跳过的列表,一个包含 Test_runs 的值,等等。
这里有一个 "minimum" 工作示例,说明我将如何做。
#!/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)