Hi,

> I would like to suggest that unit/functional/integration tests would be the
> best solution for this. I know it's not easy to get into a testing culture,
> but various projects including parts of SMW are adopting this. It solves
> these problems:

This is certainly the right approach which also reflects the
encouragement that new code only gets deployed if unit test(s) being
provided to describe the intended behaviour. The reason for this is to
shield against regressions, make change interdependencies more
visible, and help verify edge cases. Currently SMW 1.9 deploys a set
of 45+ phpunit test classes [j.1] together with 13+ qunit test suites
[j.2].

> I'd suggest that beginners working with experts should be encouraged to
> create tests as a way to understand the current code base, and that ...

Yes, if someone really wants to understand how SMW works and desires
to contribute in a meaningful way, he or she should start with unit
tests (either extend existing ones or create additional tests for
functions which have not yet been covered; for an analysis about the
coverage statistics use [2]).

> ... running tests suites should be a standard activity in releases. Jenkins 
> and Travis
> (hosted) are two continuous integration platforms.

Every time we submit code to the master phpunit tests are being run
through Jenkins [j.3, j.4] and we await that qunits test are being
handled by Jenkins as well [j.5].

== Suggestions ==
If you are working with the SMW code base:

* Don't get scared just because some "fancy" jargon is being used or
you can't find what you are looking for it at first sight

* Don't try to understand the code by simply reading it, use the means
of interacting with it.

* If you are not sure what the code does write a test [0, 1] and
extend its class/method documentation

== Addendum ==
* When using PHP, facilitate the SMW namespace [a.1] and for
JavaScript use the smw namespace to avoid polluting the global
$/window namespace [a.2, a.3, a.4]

* If you have new functionality, write your code, use dependency
injection [a.5] (to enforce loose coupling between objects) and
provide unit tests that will verify that those methods do what they
suppose to do

* Avoid static classes/methods [a.6] unless you are doing class
independent object factoring, hook interaction

* Split methods into units which will allow easy assertion (even if it
means the code gets a bit longer)

* JavaScript should follow similar rules by providing qunit tests and
encapsulate modules [j.2, a.3, a.7, a.8]

* Use type hinting where possible [a.9]

* Use meaningful in-code comments (describe what the method does, what
parameters being used, what is expected as return, when this method
was first introduced) in order for docxygen (PHP) or
jsduck(JavaScript) to generate valid documentation and help others to
understand its indented behaviour

* Avoid turning protected/private into public methods unless it is
necessary and instead use the ReflectionClass [a.10] for testing (SMW
has as several tests that is following this schema)

* If you can't test (create) certain objects because of their
complexity (e.g SMWQueryResult) use a mock or stub object [a.11, a.12,
a.13]

== Links ==

[0] http://www.semantic-mediawiki.org/wiki/Unit_tests

[1] http://net.tutsplus.com/tutorials/php/hands-on-unit-testing-with-phpunit/

[2] http://phpunit.de/manual/3.2/en/code-coverage-analysis.html

[j.1] 
https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/SemanticMediaWiki.git;a=tree;f=tests/phpunit

[j.2] 
https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/SemanticMediaWiki.git;a=tree;f=tests/qunit

[j.3] http://sourceforge.net/mailarchive/message.php?msg_id=30370087

[j.4] 
https://integration.wikimedia.org/ci/job/mwext-SemanticMediaWiki-testextensions-master/

[j.5] https://gerrit.wikimedia.org/r/#/c/53535/

[a.1] http://www.php.net/manual/en/language.namespaces.rationale.php

[a.2] https://gist.github.com/hallettj/64478

[a.3] http://yuiblog.com/blog/2007/06/12/module-pattern/

[a.4] http://www.javascripttoolbox.com/bestpractices/#namespace

[a.5] http://net.tutsplus.com/tutorials/php/dependency-injection-in-php/

[a.6] 
http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

[a.7] http://qunitjs.com/cookbook/

[a.8] http://benalman.com/talks/unit-testing-qunit.html

[a.9] http://php.net/manual/en/language.oop5.typehinting.php

[a.10] 
http://www.mikeyd.com.au/2011/01/20/how-to-use-phps-reflectionclass-to-test-private-methods-and-properties-with-phpunit/

[a.11] http://net.tutsplus.com/tutorials/php/all-about-mocking-with-phpunit/

[a.12] 
http://codeutopia.net/blog/2009/06/26/unit-testing-4-mock-objects-and-testing-code-which-uses-the-database/

[a.13] http://phpunit.de/manual/3.7/en/test-doubles.html

Cheers

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may
_______________________________________________
Semediawiki-devel mailing list
Semediawiki-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/semediawiki-devel

Reply via email to