def test_xmlrunner_buffer_output_pass(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_runner_buffer_output_pass')) self._test_xmlrunner(suite) testsuite_output = self.stream.getvalue() # Since we are always buffering stdout/stderr # it is currently troublesome to print anything at all # and be consistent with --buffer option (issue #59) self.assertIn('should not be printed', testsuite_output)
def test_basic_unittest_constructs(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) suite.addTest(self.DummyTest('test_skip')) suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_expected_failure')) suite.addTest(self.DummyTest('test_unexpected_success')) suite.addTest(self.DummyTest('test_error')) self._test_xmlrunner(suite)
def test_xmlrunner_output_subdir(self): stream = self.stream output = os.path.join(self.outdir, 'subdir') runner = xmlrunner.XMLTestRunner(stream=stream, output=output, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) runner.run(suite)
def test_xmlrunner_stream(self): stream = self.stream output = BytesIO() runner = xmlrunner.XMLTestRunner(stream=stream, output=output, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) runner.run(suite)
def test_unexpected_success(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_unexpected_success')) outdir = BytesIO() self._test_xmlrunner(suite, outdir=outdir) self.assertNotIn(b'<failure', outdir.getvalue()) self.assertIn(b'<error', outdir.getvalue()) self.assertNotIn(b'<skip', outdir.getvalue())
def test_xmlrunner_patched_stdout(self): old_stdout, old_stderr = sys.stdout, sys.stderr try: sys.stdout, sys.stderr = StringIO(), StringIO() suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) suite.properties = dict(key='value') self._test_xmlrunner(suite) finally: sys.stdout, sys.stderr = old_stdout, old_stderr
def test_xmlrunner_unsafe_unicode(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_unsafe_unicode')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn(u"<![CDATA[ABCD\n]]>".encode('utf8'), output)
def test_xmlrunner_failfast(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_pass')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, failfast=True, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn('test_fail'.encode('utf8'), output) self.assertNotIn('test_pass'.encode('utf8'), output)
def test_junitxml_xsd_validation_empty_properties(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_pass')) suite.properties = None outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertNotIn('<properties>'.encode('utf8'), output)
def test_xmlrunner_safe_xml_encoding_name(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() firstline = output.splitlines()[0] # test for issue #74 self.assertIn('encoding="UTF-8"'.encode('utf8'), firstline)
def test_xmlrunner_non_ascii_failures(self): suite = unittest.TestSuite() suite.addTest( self.DummyTest('test_non_ascii_runner_buffer_output_fail')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner(stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn(u'Where is the café ?'.encode('utf8'), output) self.assertIn(u'The café could not be found'.encode('utf8'), output)
def test_classnames(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) suite.addTest(self.DummySubTest('test_subTest_pass')) outdir = BytesIO() stream = StringIO() runner = xmlrunner.XMLTestRunner(stream=stream, output=outdir, verbosity=0) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn('classname="tests.testsuite.DummyTest" name="test_pass"' .encode('utf8'), output) self.assertIn('classname="tests.testsuite.DummySubTest" name="test_subTest_pass"' .encode('utf8'), output)
def test_partialmethod(self): from functools import partialmethod def test_partialmethod(test): pass class TestWithPartialmethod(unittest.TestCase): pass setattr( TestWithPartialmethod, 'test_partialmethod', partialmethod(test_partialmethod), ) suite = unittest.TestSuite() suite.addTest(TestWithPartialmethod('test_partialmethod')) self._test_xmlrunner(suite)
def test_xmlrunner_non_ascii(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_non_ascii_skip')) suite.addTest(self.DummyTest('test_non_ascii_error')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn( u'message="demonstrating non-ascii skipping: éçà"'.encode('utf8'), output)
def test_xmlrunner_invalid_xml_chars_in_doc(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_invalid_xml_chars_in_doc')) outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() # Finally check if we have a valid XML document or not. try: minidom.parseString(output) except Exception as e: # pragma: no cover # note: we could remove the try/except, but it's more crude. self.fail(e)
def test_unittest_subTest_with_dots(self): # Test for issue #85 suite = unittest.TestSuite() suite.addTest(self.DummySubTest('test_subTest_with_dots')) outdir = BytesIO() self._test_xmlrunner(suite, outdir=outdir) xmlcontent = outdir.getvalue().decode() # Method name self.assertNotIn('name="subTest', xmlcontent, 'parsing of test method name is not done correctly') self.assertIn('name="test_subTest_with_dots (module=\'hello.world.subTest', xmlcontent) # Class name matchString = 'classname="tests.testsuite.XMLTestRunnerTestCase.DummySubTest.test_subTest_with_dots (module=\'hello.world"' self.assertNotIn(matchString, xmlcontent, 'parsing of class name is not done correctly') self.assertIn('classname="tests.testsuite.XMLTestRunnerTestCase.DummySubTest"', xmlcontent)
def test_unittest_subTest_fail(self): # test for issue #77 outdir = BytesIO() runner = xmlrunner.XMLTestRunner(stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(self.DummySubTest('test_subTest_fail')) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn( b'<testcase classname="tests.testsuite.DummySubTest" ' b'name="test_subTest_fail (i=0)"', output) self.assertIn( b'<testcase classname="tests.testsuite.DummySubTest" ' b'name="test_subTest_fail (i=1)"', output)
def test_junitxml_xsd_validation_order(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_pass')) suite.properties = dict(key='value') outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() # poor man's schema validation; see issue #90 i_properties = output.index('<properties>'.encode('utf8')) i_system_out = output.index('<system-out>'.encode('utf8')) i_system_err = output.index('<system-err>'.encode('utf8')) i_testcase = output.index('<testcase'.encode('utf8')) self.assertTrue(i_properties < i_testcase < i_system_out < i_system_err)
def test_classnames(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) suite.addTest(self.DummySubTest('test_subTest_pass')) outdir = BytesIO() stream = StringIO() runner = xmlrunner.XMLTestRunner( stream=stream, output=outdir, verbosity=0) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertRegexpMatches( output, r'classname="tests\.testsuite\.(XMLTestRunnerTestCase\.)?' r'DummyTest" name="test_pass"'.encode('utf8'), ) self.assertRegexpMatches( output, r'classname="tests\.testsuite\.(XMLTestRunnerTestCase\.)?' r'DummySubTest" name="test_subTest_pass"'.encode('utf8'))
def test_unittest_subTest_mixed(self): # test for issue #155 outdir = BytesIO() runner = xmlrunner.XMLTestRunner(stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(self.DummySubTest('test_subTest_mixed')) runner.run(suite) outdir.seek(0) output = outdir.read() output = _strip_xml( output, { '//testsuite': (), '//testcase': ('classname', 'name'), '//failure': ('message', ), }) self.assertNotIn('name="test_subTest_mixed (i=0)"'.encode('utf8'), output) self.assertIn('name="test_subTest_mixed (i=1)"'.encode('utf8'), output)
def test_unittest_subTest_error(self): # test for issue #155 outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(self.DummySubTest('test_subTest_error')) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertRegexpMatches( output, br'<testcase classname="tests\.testsuite\.' br'(XMLTestRunnerTestCase\.)?DummySubTest" ' br'name="test_subTest_error \(i=0\)"') self.assertRegexpMatches( output, br'<testcase classname="tests\.testsuite\.' br'(XMLTestRunnerTestCase\.)?DummySubTest" ' br'name="test_subTest_error \(i=1\)"')
def test_partialmethod(self): try: from functools import partialmethod except ImportError: raise unittest.SkipTest( 'functools.partialmethod is not available.') def test_partialmethod(test): pass class TestWithPartialmethod(unittest.TestCase): pass setattr( TestWithPartialmethod, 'test_partialmethod', partialmethod(test_partialmethod), ) suite = unittest.TestSuite() suite.addTest(TestWithPartialmethod('test_partialmethod')) self._test_xmlrunner(suite)
def test_junitxml_xsd_validation_order(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_pass')) suite.addTest(self.DummyTest('test_output_stdout_and_stderr')) suite.properties = dict(key='value') outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() # poor man's schema validation; see issue #90 i_properties = output.index('<properties>'.encode('utf8')) i_system_out = output.index('<system-out>'.encode('utf8')) i_system_err = output.index('<system-err>'.encode('utf8')) i_testcase = output.index('<testcase'.encode('utf8')) self.assertTrue(i_properties < i_testcase < i_system_out < i_system_err) # XSD validation - for good measure. validate_junit_report('14c6e39c38408b9ed6280361484a13c6f5becca7', output)
def test_xunit_plugin_transform(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_fail')) suite.addTest(self.DummyTest('test_pass')) suite.properties = None outdir = BytesIO() runner = xmlrunner.XMLTestRunner( stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) runner.run(suite) outdir.seek(0) output = outdir.read() validate_junit_report('14c6e39c38408b9ed6280361484a13c6f5becca7', output) with self.assertRaises(etree.DocumentInvalid): validate_junit_report('ae25da5089d4f94ac6c4669bf736e4d416cc4665', output) from xmlrunner.extra.xunit_plugin import transform transformed = transform(output) validate_junit_report('14c6e39c38408b9ed6280361484a13c6f5becca7', transformed) validate_junit_report('ae25da5089d4f94ac6c4669bf736e4d416cc4665', transformed) self.assertIn('test_pass'.encode('utf8'), transformed) self.assertIn('test_fail'.encode('utf8'), transformed)
def test_unittest_subTest(self): # test for issue #77 class DummySubTest(unittest.TestCase): def test_subTest(self): for i in range(2): with self.subTest(i=i): self.fail('this is a subtest.') outdir = BytesIO() runner = xmlrunner.XMLTestRunner(stream=self.stream, output=outdir, verbosity=self.verbosity, **self.runner_kwargs) suite = unittest.TestSuite() suite.addTest(DummySubTest('test_subTest')) runner.run(suite) outdir.seek(0) output = outdir.read() self.assertIn( b'<testcase classname="tests.testsuite.DummySubTest" ' b'name="test_subTest (i=0)"', output) self.assertIn( b'<testcase classname="tests.testsuite.DummySubTest" ' b'name="test_subTest (i=1)"', output)
def test_xmlrunner_cdata_section(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_cdata_section')) self._test_xmlrunner(suite)
def test_xmlrunner_error_in_call(self): suite = unittest.TestSuite() suite.addTest(self.DummyErrorInCallTest('test_pass')) self._test_xmlrunner(suite) testsuite_output = self.stream.getvalue() self.assertIn('Exception: Massive fail', testsuite_output)
def test_junitxml_properties(self): suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) suite.properties = dict(key='value') self._test_xmlrunner(suite)
def test_opaque_decorator(self): suite = unittest.TestSuite() suite.addTest(self.DecoratedUnitTest('test_pass')) self._test_xmlrunner(suite) testsuite_output = self.stream.getvalue() self.assertNotIn('IOError:', testsuite_output)
def test_xmlrunner_elapsed_times(self): self.runner_kwargs['elapsed_times'] = False suite = unittest.TestSuite() suite.addTest(self.DummyTest('test_pass')) self._test_xmlrunner(suite)