python / cpython

The Python programming language
https://www.python.org
Other
63.26k stars 30.29k forks source link

Additional assert methods for unittest #71339

Open serhiy-storchaka opened 8 years ago

serhiy-storchaka commented 8 years ago
BPO 27152
Nosy @rhettinger, @rbtcollins, @ezio-melotti, @bitdancer, @voidspace, @serhiy-storchaka, @PythonCHB
Files
  • extra_assertions.patch
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields: ```python assignee = None closed_at = None created_at = labels = ['type-feature', 'tests'] title = 'Additional assert methods for unittest' updated_at = user = 'https://github.com/serhiy-storchaka' ``` bugs.python.org fields: ```python activity = actor = 'r.david.murray' assignee = 'none' closed = False closed_date = None closer = None components = ['Tests'] creation = creator = 'serhiy.storchaka' dependencies = [] files = ['43047'] hgrepos = [] issue_num = 27152 keywords = ['patch'] message_count = 10.0 messages = ['266600', '266601', '266620', '266627', '266675', '266682', '267175', '267185', '268877', '269074'] nosy_count = 8.0 nosy_names = ['rhettinger', 'rbcollins', 'ezio.melotti', 'r.david.murray', 'michael.foord', 'Pam.McANulty', 'serhiy.storchaka', 'ChrisBarker'] pr_nums = [] priority = 'normal' resolution = None stage = 'patch review' status = 'open' superseder = None type = 'enhancement' url = 'https://bugs.python.org/issue27152' versions = ['Python 3.6'] ```

    serhiy-storchaka commented 8 years ago

    Proposed patch adds the ExtraAssertions mix-in that provides additional assert methods. These methods provide better failure report than assertTrue/assertFalse with a result of corresponding function. For example assertStartsWith outputs shorten reprs of the start of the string and prefix.

    These checks are quite popular and can be used tens or hundreds times in tests (the patch makes tests using new assert methods):

    assertHasAttr 121 times assertNotHasAttr 99 times assertIsSubclass 243 times assertNotIsSubclass 95 times assertStartsWith 131 times assertEndsWith 73 times

    serhiy-storchaka commented 8 years ago

    Additional statistics that proves that specified checks are not specific for narrow group of tests:

    assertHasAttr 121 times in 57 files assertNotHasAttr 99 times in 31 files assertIsSubclass 243 times in 30 files assertNotIsSubclass 95 times in 5 files assertStartsWith 131 times in 59 files assertEndsWith 73 times in 36 files

    bitdancer commented 8 years ago

    Why a mixin?

    (As an aside, there is a proposal to move all assert methods to a place where they can be accessed outside test cases.)

    serhiy-storchaka commented 8 years ago

    I have this proposal (bpo-19645) in mind. We can add these method just in TestCase.

    In any case I'm going to add the ExtraAssertions mixin in test.support in maintained versions to help keeping branches in sync.

    rhettinger commented 8 years ago

    I don't really like the assertEndsWith method which triggers a mental hiccup when taking a familiar method call, making it into function call, and giving an awkward looking camelcase name.

    Also, Guido is usually opposed to broad, sweeping search/replace patches. Instead, he has advocated "holistic refactoring" where updates are done by someone actively working on the module rather than a disinterested party churning the code without thinking deeply about the topic at hand.

    serhiy-storchaka commented 8 years ago

    Changes in tests are provided as a demonstration that these methods are useful. I propose to commit only the unittest part, and use new methods on a case-by-case basis. For example some tests already define methods like assertHasAttr or assertIsSubclass, They can now use standard methods.

    assertEndsWith() can be used 73 times in 36 files. It produces more useful error report than assertTrue(a.endswith(b)).

    202d193d-f083-461e-a326-928c1d924ea3 commented 8 years ago

    Why a mixin rather than adding to TestCase? If they are useful they should be easy to find.

    Also, see bpo-27198 for another possible new assert.

    rbtcollins commented 8 years ago

    I'm fine with these as a mixin - they are all very generic and unambiguously named. I'd marginally prefer the opt-in mixin over adding them to the base class.

    Ideally they'd be matchers, but since I haven't ported that upstream yet, thats asking for more work, and we can always migrate later.

    (https://rbtcollins.wordpress.com/2010/05/10/maintainable-pyunit-test-suites/ and http://testtools.readthedocs.io/en/latest/for-test-authors.html#matchers - sorry about the formatting in the blog post, wordpress changed theme details some time after I wrote the post and it now renders horribly :( )

    rhettinger commented 8 years ago

    Ask five people to spell "assertEndsWith" and see how many of them capitalize the "W".

    bitdancer commented 8 years ago

    I would expect it to be assertEndswith, etc. You will note that all the other cases of multiple capitals are either englishification of symbolic operators or concatenations of separate type words and/or syntactically distinct operators.

    gpshead commented 1 year ago

    absl.testing.absltest includes some of these methods.

    In particular assertStartsWith and assertEndsWith (and Not variants) are its simplest addition. I "only" see those used 2-3000 test files in our huge internal codebase which puts it in a <10% use them category. Their goal is to provide a nice error message, it does that. Those 2-4 would be trivial additions with no maintenance burden. (I'd go with 2, the negative Not variants see almost no use in practice).

    Outside of the stdlib I assume pytest may provide nice output on startswith and endwith comparison failures?

    As for the method name spelling, anyone typing it wrong gets a failure immediately so that isn't a big deal, rapid feedback when wrong. They're fully consistent with the junit javaCaseStyle of unittest assertion methods with words delineated by a case change.

    voidspace commented 1 year ago

    +1 to assertStartsWith and assertEndsWith, they sound useful

    AlexWaygood commented 1 year ago

    assertIsSubclass and assertNotIsSubclass are used quite a bit in test_typing and the tests for the third-party typing_extensions backport. Their implementations are simple, and they seem like pretty natural extensions, given that assertIsInstance and assertNotIsInstance already exist.

    xsdg commented 10 months ago

    Hi, y'all. Just to keep things narrowly-scoped and specific, what would it take to get assertStartsWith and assertEndsWith into unittest.TestCase?

    gpshead commented 10 months ago

    A PR adding those two and relevant unittests.