qubes/doc: Test's documentation improvement
This commit is contained in:
parent
eabc571102
commit
b442fb0fab
@ -42,14 +42,30 @@ First of all, testing is art, not science. Testing is not panaceum and won't
|
|||||||
solve all of your problems. Rules given in this guide and elsewhere should be
|
solve all of your problems. Rules given in this guide and elsewhere should be
|
||||||
followed, but shouldn't be worshipped.
|
followed, but shouldn't be worshipped.
|
||||||
|
|
||||||
When writing test, you should think about order of execution. Tests should be
|
Test can be divided into three phases. The first part is setup phase. In this
|
||||||
written bottom-to-top, that is, tests that are ran later may depend on features
|
part you should arrange for a test condition to occur. You intentionally put
|
||||||
|
system under test in some specific state. Phase two is executing test condition
|
||||||
|
-- for example you check some variable for equality or expect that some
|
||||||
|
exception is raised. Phase three is responsible for returning a verdict. This is
|
||||||
|
largely done by the framework.
|
||||||
|
|
||||||
|
When writing test, you should think about order of execution. This is the reason
|
||||||
|
of numbers in names of the classes and test methods. Tests should be written
|
||||||
|
bottom-to-top, that is, test setups that are ran later may depend on features
|
||||||
that are tested after but not the other way around. This is important, because
|
that are tested after but not the other way around. This is important, because
|
||||||
when encountering failure we expect the reason happen *before*, and not after
|
when encountering failure we expect the reason happen *before*, and not after
|
||||||
failure occured. Therefore, when encountering multiple errors, we may instantly
|
failure occured. Therefore, when encountering multiple errors, we may instantly
|
||||||
focus on fixing the first one and not wondering if any later problems may be
|
focus on fixing the first one and not wondering if any later problems may be
|
||||||
relevant or not. This is the reason of numbers in names of the classes and test
|
relevant or not. Some people also like to enable
|
||||||
methods.
|
:py:attr:`unittest.TestResult.failfast` feature, which stops on the first failed
|
||||||
|
test -- with wrong order this messes up their workflow.
|
||||||
|
|
||||||
|
Test should fail for one reason only and test one specific issue. This does not
|
||||||
|
mean that you can use one ``.assert*`` method per ``test_`` function: for
|
||||||
|
example when testing one regular expression you are welcome to test many valid
|
||||||
|
and/or invalid inputs, especcialy when test setup is complicated. However, if
|
||||||
|
you encounter problems during setup phase, you should *skip* the test, and not
|
||||||
|
fail it. This also aids interpretation of results.
|
||||||
|
|
||||||
You may, when it makes sense, manipulate private members of classes under tests.
|
You may, when it makes sense, manipulate private members of classes under tests.
|
||||||
This violates one of the founding principles of object-oriented programming, but
|
This violates one of the founding principles of object-oriented programming, but
|
||||||
@ -86,7 +102,7 @@ class which uses :py:class:`qubes.tests.TestEmitter` as mix-in::
|
|||||||
import qubes.tests
|
import qubes.tests
|
||||||
|
|
||||||
class TestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
class TestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class TC_20_PropertyHolder(qubes.tests.QubesTestCase):
|
class TC_20_PropertyHolder(qubes.tests.QubesTestCase):
|
||||||
def test_000_event(self):
|
def test_000_event(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user