Hello Everyone!

I think we have two different approaches here, each approach depends on our
definition of unit, what exactly should be our unit to test should it be
method-based or functionality based (group of methods defining a
functionality).

As Serena mentioned, In case of functionality based, when a test would
fail... we will easily know which functionality is broken but functionality
itself is a pipeline of methods right (correct me if I am wrong)? In this
pipeline, we won't know which condition in which method is exactly breaking
the test. As per my understanding unit tests should be written at the
granularity level and methods are more granular than functionality. Also we
have to make a deal with the coverage rate in case of functionality testing.

Taking given example in case of method based approach:
cli_base.env() and cli_env.prepare():

If we will go method based approach then one unit test for cli_base.env()
make sense and depending on the behaviour (considering branches/exception
etc.) of cli_env.prepare() multiple tests for the same method could be
there ( currently two written:
https://gerrit.opnfv.org/gerrit/#/c/26143/13/functest/tests/unit/cli/commands/test_cli_env.py
).

I agree we won't have high level overview about the functionality but
wondering if that is the motive of writing unit tests but we would have all
the possible breaking points covered in each functionality.

Benefit of taking method based approach is:
1. we will know the exact method/condition where the issue is
2. There would be separation (non-overlapping) among the tests i.e. ideally
unit tests should have
3. We can achieve good code coverage
4. Our test would be much more modular and granular.

Also, I have prepared some slides mentioning some points I felt and
explored about unit tests.
I have make the link editable so that anyone with the link can edit, please
correct me if I am wrong somewhere  or add more points if needed.
Link:
https://docs.google.com/presentation/d/1vFVLP1SRPaKL3b90wTlc6NuE6zyf5Q4FhbxcN12W4IA/edit?usp=sharing


Thanks

On Wed, Jan 4, 2017 at 12:12 PM, Yujun Zhang <[email protected]>
wrote:

> Serena,
>
> Maybe the term `interface` fits better here. I agree with you that the
> target of unit test in Python is *module*.
>
> We ensure with unit test the existing interfaces of the module are not
> broken by new code and new interfaces implemented work as expected.
>
> The private methods (which does not expose anything of the module) is not
> something promised by the module and we don't need to create dedicated unit
> test for them. They are normally covered by the unit test of related public
> methods.
>
> My another two cents...
>
> On Wed, Jan 4, 2017 at 2:04 PM <[email protected]> wrote:
>
>> Sorry, I didn't express my idea clearly enough during the meeting.
>>
>> When I say function-based, it is not equal to functional test. Unlike
>> functional test, it is still a kind of white-box test.
>>
>> And compared to method-based unit test, which consider the method as a
>> test object, it treats the module as an unit,
>>
>> it guarantees the module works as expected after new requirements come or
>> any refactor requires.
>>
>>
>> Sorry for my poor expression, and let me take 'functest env prepare' of
>> cli module in Functest for
>>
>> example(where the discussion comes from).
>>
>> Instead of testing cli_base.env() and cli_env.prepare() separately,
>>
>> we can test them together by writing the following four test cases(naming
>> is not very good just for description purpose):
>>
>> test_cli_env_first_time_prepare()
>>
>> test_cli_env_re_prepare()
>>
>> test_cli_env_not_prepare_again()
>>
>> test_cli_env_invalid_prepare_answer()
>>
>> In this way, all the code can be covered as method-based way do, and at
>> the same time when something
>>
>> changed in cli_env.prepare() and if it doesn't break the functionality it
>> should provide, we don't need to
>>
>> rewrite the unit test, and on the contrary, if it breaks, the unit test
>> will detect it and notify us with a failure,
>>
>> and of course, if the functionality needs to change, we should rewrite
>> the unit test.
>>
>> If unit test is written in the way of method-based, almost everytime the
>> code change will cause the rewriting
>>
>> of the test code, and further more whether it breaks the original
>> functionality, we cannot tell.
>>
>>
>> BRs
>>
>> Serena
>>
>>
>>
>>


-- 
Ashish Kumar
IIIT Hyderabad
+91 9581528645
_______________________________________________
opnfv-tech-discuss mailing list
[email protected]
https://lists.opnfv.org/mailman/listinfo/opnfv-tech-discuss

Reply via email to