[Notes] [Git][BuildStream/buildstream][aevri/contributing_e2e_tests] fixup! WIP: contributing: more clarity on testing



Title: GitLab

Angelos Evripiotis pushed to branch aevri/contributing_e2e_tests at BuildStream / buildstream

Commits:

1 changed file:

Changes:

  • CONTRIBUTING.rst
    ... ... @@ -1547,50 +1547,40 @@ Tests that run a sandbox should be decorated with::
    1547 1547
     
    
    1548 1548
     and use the integration cli helper.
    
    1549 1549
     
    
    1550
    -- End-to-end testing is the most valuable.
    
    1551
    -- tests which observe how these behaviors impact and define the outward user
    
    1552
    -  experience.
    
    1553
    -
    
    1554 1550
     You must test your changes in an end-to-end fashion. Consider the first end to
    
    1555
    -be the appropriate user interface, and the other the change you have made. The
    
    1556
    -aim for testing is to make assertions about how you impact and define the
    
    1551
    +be the appropriate user interface, and the other end to be the change you have
    
    1552
    +made.
    
    1553
    +
    
    1554
    +The aim for our tests is to make assertions about how you impact and define the
    
    1557 1555
     outward user experience. You should be able to exercise all code paths via the
    
    1558 1556
     user interface, just as one can test the strength of rivets by sailing dozens
    
    1559
    -of ocean liners.
    
    1557
    +of ocean liners. Keep in mind that your ocean liners could be sailing properly
    
    1558
    +*because* of a malfunctioning rivet. End-to-end testing will warn you that
    
    1559
    +fixing the rivet will sink the ships.
    
    1560 1560
     
    
    1561 1561
     The primary user interface is the cli, so that should be the first candidate
    
    1562 1562
     'end' for testing. Most of the value of BuildStream comes from what you can
    
    1563 1563
     achieve with the cli.
    
    1564 1564
     
    
    1565
    -We also have a *"Public API Surface"*, which you should consider the next
    
    1566
    -target. This is mainly for advanced users to implement their plugins against.
    
    1567
    -
    
    1568
    -- Useful for Internal API surfaces, e.g. YAML and CasCache.
    
    1569
    -- Test what the function does, rather than what it should do, need to think in thelarger context.
    
    1570
    -- Don't fool yourself that because a function has a test that passes, that it
    
    1571
    -  is doing the right thing.
    
    1572
    -- If something is not reachable in end-to-end testing, perhaps it is dead
    
    1573
    -  code and if so should be removed, instead of tested.
    
    1574
    -- Unit tests can provide direct indication of what is broken.
    
    1575
    -- You should be able to exercise all code paths via the user interface, just
    
    1576
    -  as one can test the strength of rivets by sailing dozens of ocean liners,
    
    1577
    -- providing coverage isn't all of testing.
    
    1578
    -- it could turn out that your ocean liners are sailing properly *because* of
    
    1579
    -  a malfunctioning rivet, this is also a very undesirable situation.
    
    1580
    -- End-to-end testing and unit-testing are not mutually exclusive, you must
    
    1581
    -  implement end-to-end tests.
    
    1582
    -
    
    1583
    -You should first aim to write tests that exercise your changes from the cli.
    
    1584
    -This is so that the testing is end-to-end, and the changes are guaranteed to
    
    1585
    -work for the end-user. The cli is considered stable, and so tests written in
    
    1586
    -terms of it are unlikely to require updating as the internals of the software
    
    1587
    -change over time.
    
    1588
    -
    
    1589
    -It may be impractical to sufficiently examine some changes this way. For
    
    1590
    -example, the number of cases to test and the running time of each test may be
    
    1591
    -too high. It may also be difficult to contrive circumstances to cover every
    
    1592
    -line of the change. If this is the case, next you can consider also writing
    
    1593
    -unit tests that work more directly on the changes.
    
    1565
    +We also have a :ref:`*"Public API Surface"*<contributing_public_api_surface>`,
    
    1566
    +which you should consider a secondary target. This is mainly for advanced users
    
    1567
    +to implement their plugins against.
    
    1568
    +
    
    1569
    +Note that both of these targets for testing are guaranteed to continue working
    
    1570
    +in the same way across versions. This means that tests written in terms of them
    
    1571
    +will be robust to large changes to the code. This important property means that
    
    1572
    +BuildStream developers can make large refactorings without needing to rewrite
    
    1573
    +fragile tests.
    
    1574
    +
    
    1575
    +Another user to consider is the BuildStream developer, therefore internal API
    
    1576
    +surfaces are also targets for testing. For example, the YAML loading code and
    
    1577
    +the CasCache. Remember that these surfaces are still just a means to the end of
    
    1578
    +providing value through the cli and the Public API Surface.
    
    1579
    +
    
    1580
    +It may be impractical to sufficiently examine some changes in an end-to-end
    
    1581
    +fashion. For example, the number of cases to test and the running time of each
    
    1582
    +test may be too high. Such typically low-level things, e.g. parsers, may also
    
    1583
    +be tested with unit tests - alongside the mandatory end-to-end tests.
    
    1594 1584
     
    
    1595 1585
     It is important to write unit tests in such a way that they do not break due to
    
    1596 1586
     changes unrelated to what they are meant to test. For example, if the test
    
    ... ... @@ -1598,6 +1588,9 @@ relies on a lot of BuildStream internals, a large refactoring will likely
    1598 1588
     require the test to be rewritten. Pure functions that only rely on the Python
    
    1599 1589
     Standard Library are excellent candidates for unit testing.
    
    1600 1590
     
    
    1591
    +Unit tests only make it easier to implement things correctly, end-to-end tests
    
    1592
    +make it easier to implement the right thing.
    
    1593
    +
    
    1601 1594
     
    
    1602 1595
     Measuring performance
    
    1603 1596
     ---------------------
    



  • [Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]