Index: third_party/typ/typ/tests/main_test.py |
diff --git a/third_party/typ/typ/tests/main_test.py b/third_party/typ/typ/tests/main_test.py |
index f0d027d3836bd3bcf1397cac4424fa9ecf753c56..02993755ea62c52e45b972eb25586fde69fbe65b 100644 |
--- a/third_party/typ/typ/tests/main_test.py |
+++ b/third_party/typ/typ/tests/main_test.py |
@@ -141,16 +141,17 @@ SF_TEST_FILES = {'sf_test.py': SF_TEST_PY} |
LOAD_TEST_PY = """ |
import unittest |
-def load_tests(_, _2, _3): |
- class BaseTest(unittest.TestCase): |
- pass |
- def method_fail(self): |
- self.fail() |
+class BaseTest(unittest.TestCase): |
+ pass |
- def method_pass(self): |
- pass |
+def method_fail(self): |
+ self.fail() |
+ |
+def method_pass(self): |
+ pass |
+def load_tests(_, _2, _3): |
setattr(BaseTest, "test_fail", method_fail) |
setattr(BaseTest, "test_pass", method_pass) |
suite = unittest.TestSuite() |
@@ -162,82 +163,6 @@ def load_tests(_, _2, _3): |
LOAD_TEST_FILES = {'load_test.py': LOAD_TEST_PY} |
-MIXED_TEST_PY = """ |
-import unittest |
-class SampleTest(unittest.TestCase): |
- |
- def test_pass_0(self): |
- self.assertEqual(1, 1) |
- |
- def test_pass_1(self): |
- self.assertEqual(1, 1) |
- |
- def test_fail_0(self): |
- self.assertEqual(1, 2) |
- |
- def test_fail_1(self): |
- raise Exception() |
- |
- @unittest.skip('Skip for no reason') |
- def test_skip_0(self): |
- pass |
-""" |
- |
- |
-LOAD_MANY_TEST_PY = """ |
-import unittest |
- |
-def generate_test_case(test_method_name, test_type): |
- class GeneratedTest(unittest.TestCase): |
- pass |
- |
- if test_type == 'pass': |
- def test_method(self): |
- self.assertEqual(1, 1) |
- elif test_type == 'fail': |
- def test_method(self): |
- self.assertEqual(1, 2) |
- elif test_type == 'skip': |
- def test_method(self): |
- self.skipTest('Skipped') |
- else: |
- raise Exception |
- |
- setattr(GeneratedTest, test_method_name, test_method) |
- return GeneratedTest(test_method_name) |
- |
- |
-def load_tests(loader, standard_tests, pattern): |
- del loader, standard_tests, pattern # unused |
- |
- suite = unittest.TestSuite() |
- |
- passed_test_names = [ |
- str('test_pass_%s' % i) for i in range(2, 15)] |
- |
- failed_test_names = [ |
- str('test_fail_%s' % i) for i in range(2, 10)] |
- |
- skipped_test_names = [ |
- str('test_skip_%s' % i) for i in range(1, 10)] |
- |
- for test_method_name in passed_test_names: |
- suite.addTest(generate_test_case(test_method_name, 'pass')) |
- |
- for test_method_name in failed_test_names: |
- suite.addTest(generate_test_case(test_method_name, 'fail')) |
- |
- for test_method_name in skipped_test_names: |
- suite.addTest(generate_test_case(test_method_name, 'skip')) |
- |
- return suite |
-""" |
- |
- |
-MANY_TEST_FILES = { |
- 'mixed_test.py': MIXED_TEST_PY, # 2 passes, 2 fails, 1 skip |
- 'load_many_test.py': LOAD_MANY_TEST_PY} # 13 passes, 13 fails, 9 skips |
- |
path_to_main = os.path.join( |
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), |
@@ -248,34 +173,6 @@ class TestCli(test_case.MainTestCase): |
prog = [sys.executable, path_to_main] |
files_to_ignore = ['*.pyc'] |
- def get_test_results_stat(self, test_output): |
- num_passes = test_output.count(' passed\n') |
- num_fails = test_output.count(' failed unexpectedly:\n') |
- num_skips = test_output.count(' was skipped\n') |
- return num_passes, num_fails, num_skips |
- |
- def run_and_check_test_results(self, num_shards): |
- total_passes, total_fails, total_skips = 0, 0, 0 |
- min_num_tests_run = float('inf') |
- max_num_tests_run = 0 |
- for shard_index in range(num_shards): |
- _, out, _, _ = self.check( |
- ['--total-shards', str(num_shards), '--shard-index', |
- str(shard_index)], files=MANY_TEST_FILES) |
- passes, fails, skips = self.get_test_results_stat(out) |
- total_passes += passes |
- total_fails += fails |
- total_skips += skips |
- num_tests_run = passes + fails |
- min_num_tests_run = min(min_num_tests_run, num_tests_run) |
- max_num_tests_run = max(max_num_tests_run, num_tests_run) |
- self.assertEqual(total_passes, 15) |
- self.assertEqual(total_fails, 10) |
- self.assertEqual(total_skips, 10) |
- |
- # Make sure that we don't distribute the tests too unevenly. |
- self.assertLessEqual(max_num_tests_run - min_num_tests_run, 2) |
- |
def test_bad_arg(self): |
self.check(['--bad-arg'], ret=2, out='', |
rerr='.*: error: unrecognized arguments: --bad-arg\n') |
@@ -305,12 +202,12 @@ class TestCli(test_case.MainTestCase): |
[1/1] pass_test.PassingTest.test_pass passed |
1 test run, 0 failures. |
- Name Stmts Miss Cover |
- ------------------------------- |
- fail_test 4 4 0% |
- pass_test 4 0 100% |
- ------------------------------- |
- TOTAL 8 4 50% |
+ Name Stmts Miss Cover |
+ ---------------------------------- |
+ fail_test.py 4 4 0% |
+ pass_test.py 4 0 100% |
+ ---------------------------------- |
+ TOTAL 8 4 50% |
""")) |
except ImportError: # pragma: no cover |
# We can never cover this line, since running coverage means |
@@ -374,6 +271,32 @@ class TestCli(test_case.MainTestCase): |
'fail_then_pass_test']['FPTest']['test_count']['actual'], |
'FAIL PASS') |
+ def test_fail_then_skip(self): |
+ files = {'fail_then_skip_test.py': d("""\ |
+ import unittest |
+ count = 0 |
+ class FPTest(unittest.TestCase): |
+ def test_count(self): |
+ global count |
+ count += 1 |
+ if count == 1: |
+ self.fail() |
+ elif count == 2: |
+ self.skipTest('') |
+ """)} |
+ _, out, _, files = self.check(['--retry-limit', '3', |
+ '--write-full-results-to', |
+ 'full_results.json'], |
+ files=files, ret=0, err='') |
+ self.assertIn('Retrying failed tests (attempt #1 of 3)', out) |
+ self.assertNotIn('Retrying failed tests (attempt #2 of 3)', out) |
+ self.assertIn('1 test run, 0 failures.\n', out) |
+ results = json.loads(files['full_results.json']) |
+ self.assertEqual( |
+ results['tests'][ |
+ 'fail_then_skip_test']['FPTest']['test_count']['actual'], |
+ 'FAIL SKIP') |
+ |
def test_failures_are_not_elided(self): |
_, out, _, _ = self.check(['--terminal-width=20'], |
files=FAIL_TEST_FILES, ret=1, err='') |
@@ -445,8 +368,7 @@ class TestCli(test_case.MainTestCase): |
pass |
""")} |
self.check(['-l', 'foo.py'], files=files, ret=1, err='', |
- rout=('Failed to load "foo.py": No module named ' |
- '\'?package_that_does_not_exist\'?\n')) |
+ rout=('Failed to load "foo.py":')) |
def test_import_failure_no_tests(self): |
files = {'foo.py': 'import unittest'} |
@@ -463,9 +385,7 @@ class TestCli(test_case.MainTestCase): |
""")} |
_, out, _, _ = self.check([], files=files, ret=1, err='') |
self.assertIn('Failed to import test module: syn_test', out) |
- self.assertIn((' syntax error\n' |
- ' ^\n' |
- 'SyntaxError: invalid syntax\n'), out) |
+ self.assertIn('SyntaxError: invalid syntax', out) |
def test_interrupt(self): |
files = {'interrupt_test.py': d("""\ |
@@ -489,8 +409,8 @@ class TestCli(test_case.MainTestCase): |
def load_tests(_, _2, _3): |
raise ValueError('this should fail') |
""")} |
- self.check([], files=files, ret=1, err='', |
- out=('foo_test.load_tests() failed: this should fail\n')) |
+ _, out, _, _ = self.check([], files=files, ret=1, err='') |
+ self.assertIn('this should fail', out) |
def test_load_tests_single_worker(self): |
files = LOAD_TEST_FILES |
@@ -632,17 +552,46 @@ class TestCli(test_case.MainTestCase): |
self.assertIn('sf_test.SkipSetup.test_notrun was skipped', out) |
def test_sharding(self): |
- # Test no sharding. |
- self.run_and_check_test_results(1) |
- |
- # A typical with 4 shards. |
- self.run_and_check_test_results(4) |
- |
- # Case which number of shards is a prime. |
- self.run_and_check_test_results(7) |
- # Case which number of shards is more than number of tests. |
- self.run_and_check_test_results(50) |
+ def run(shard_index, total_shards, tests): |
+ files = {'shard_test.py': textwrap.dedent( |
+ """\ |
+ import unittest |
+ class ShardTest(unittest.TestCase): |
+ def test_01(self): |
+ pass |
+ |
+ def test_02(self): |
+ pass |
+ |
+ def test_03(self): |
+ pass |
+ |
+ def test_04(self): |
+ pass |
+ |
+ def test_05(self): |
+ pass |
+ """)} |
+ _, out, _, _ = self.check( |
+ ['--shard-index', str(shard_index), |
+ '--total-shards', str(total_shards), |
+ '--jobs', '1'], |
+ files=files) |
+ |
+ exp_out = '' |
+ total_tests = len(tests) |
+ for i, test in enumerate(tests): |
+ exp_out += ('[%d/%d] shard_test.ShardTest.test_%s passed\n' % |
+ (i + 1, total_tests, test)) |
+ exp_out += '%d test%s run, 0 failures.\n' % ( |
+ total_tests, "" if total_tests == 1 else "s") |
+ self.assertEqual(out, exp_out) |
+ |
+ run(0, 1, ['01', '02', '03', '04', '05']) |
+ run(0, 2, ['01', '03', '05']) |
+ run(1, 2, ['02', '04']) |
+ run(0, 6, ['01']) |
def test_subdir(self): |
files = { |
@@ -682,7 +631,7 @@ class TestCli(test_case.MainTestCase): |
self.assertEqual(len(posts), 1) |
payload = posts[0][2].decode('utf8') |
- self.assertIn('"test_pass": {"expected": "PASS", "actual": "PASS"}', |
+ self.assertIn('"test_pass": {"actual": "PASS", "expected": "PASS"}', |
payload) |
self.assertTrue(payload.endswith('--\r\n')) |
self.assertNotEqual(server.log.getvalue(), '') |