I think that your point was well received. I am just happy that testing is getting attention.
Ron On 19/07/2016 7:53 PM, Scott Gray wrote:
I'm not looking for any sort of response really. I was just speaking in favor of integration tests because I think they provide better coverage at the cost of a little bit of speed (the framework has to be running to run them). Most of the responses coming in were of the form "unit tests are great because [insert a reason that applies to any type of test]". So I was merely pointing out that the arguments weren't specific to unit tests and hence weren't really adding value to the discussion. Regards Scott On 20 July 2016 at 02:05, Ron Wheeler <[email protected]> wrote:It is not clear what you are expecting as a specific response. As you move up the food chain, the definition of "units" changes and the tests get more complicated and the design of the tests gets more complex (mock objects, testing race conditions). It is hard to make specific comments about what kind of testing will give the highest level of confidence at each level but we are going in the right direction. The fact that we are considering tests as a major development activity is a big step forward. We can argue about specific cases (scope, tools, value, etc) as we get to them. I think that we are at the "good idea" stage rather than at the "policy" stage at this point. Ron On 19/07/2016 4:23 AM, Scott Gray wrote:I think people are missing my point because they keep replying with generic statements that aren't specific to unit tests. On 19 July 2016 at 20:08, Montalbano Florian < [email protected]> wrote: Hi everyone,unit tests and integration tests are complementary and with test, the more the better. Implementing unit tests will be a great load of work but it is the same with every kind of test. As Taher said, we will gain a lot from those unit tests for avoiding regression while refactoring the framework. From the start component scope, it has already be proved useful. And what Ron said about encouraging the creation of "smaller class that can be tested easily" is very important too. It can be a first step to reach TDD in the OFBiz development. TDD can help to give confidence to newcomer and veteran when updating some part of the code and as Hans said, this lead to "continuous improvement and finally continuous deployment". I'm aware that this does not solve the technical implementation stuff, but I think this is an improvement that need to be supported. Have a nice day, Florian Montalbano Le 19/07/2016 09:04, Pierre Smits a écrit : As with anything, the law of diminishing returns also applies to OFBizand tests. This is not true for unit tests and system integration tests, but also for user acceptance and performance tests. Nevertheless, the work done up to now is a good start and - I feel confident - appreciated. And unit tests are certainly valuable in the framework stack. How it will be for functions (regarding components in application and special purpose stack) needs to be addressed when we reach that bridge. Best regards, Pierre Smits ORRTIZ.COM <http://www.orrtiz.com> OFBiz based solutions & services OFBiz Extensions Marketplace http://oem.ofbizci.net/oci-2/ On Tue, Jul 19, 2016 at 8:22 AM, Taher Alkhateeb < [email protected] wrote:Hi Scott, Well spoken thank you. Okay may I suggest that for any such work we will discuss it here see its Merit and if it makes sense then we take it in. It is a little early to discuss it right now because we did not yet go to the higher-level components. Once we do I'll be sure to have a conversation about this in here and would appreciate your input to it. Regards, Taher Alkhateeb On Jul 19, 2016 9:00 AM, "Scott Gray" <[email protected]> wrote: Yeah I'm sure unit tests probably worked well for the start component given it is the lowest level component in the system and closest to a basicjavaapp. I just think the value proposition might decrease the further upthestack we move with them. I'm not against unit tests when they proveuseful, but further up the stack I think we should prove the case for thembefore doing much work to support the mocking that will be required tokeepthem inline with 'best practices'.In OFBiz "bad or unwanted" tends to come mostly in the way of increasing complexity from features that require more effort to maintain than the value they provide to the community. I think there's a chance attempting to mock service tests could fall into that bucket. I could be wrong, but Ithink it's worth looking into before we declare that unit tests are thebest form of testing for OFBiz. Regards Scott On 19 July 2016 at 17:37, Taher Alkhateeb <[email protected] wrote: Hi Scott,Thank you for the feedback. To be focused exactly on integration vs unit, Ialready mentioned above that at least for me the main objective is toconfidently and quickly run the tests in short bursts of red-green refactor. This allows me to refactor code without waiting in front of thescreen in between test cycles thus giving me immediate feedback on anyerrors I made. Perhaps my intro was too long so this is the squeezed outversion of it.I already had one round of testing in the start component which was muchfaster that way and had an immediate impact. Oh and by the way, you cannot test the start component with integration tests for example unless youdoit from an external component which cannot access package protected items. This style of coding is applicable I think to any software projectinclusive of OFBiz. Maybe in certain components more than others or certainareas more than others. But I can't see how it could be bad orunwanted.Taher AlkhateebOn Jul 19, 2016 8:18 AM, "Scott Gray" <[email protected]> wrote: Thanks Ron and Taher for your responses, I appreciate them but I don'thearmuch in the conversation that speaks to the value of unit tests overintegration tests. Most of the thoughts shared speaks more to the valueof tests rather than differences in the type of tests.Speed: At an application level we have ~685 tests that run in 35 seconds(excluding build and data load). Another point is that there isn't much reason why tests can't be run in parallel rather than sequentially.TDD: Integration tests in OFBiz are as simple if not simpler to write thanunit tests and just as useful for TDD.I'm not sure if I missed any other points raised regarding integrationvs.unit tests?I'm not looking to start a big long debate on the topic, I just wantedto speak out that someone out there (me) doesn't think unit tests arethebestsolution for testing OFBiz applications.Regards Scott On 19 July 2016 at 16:52, Taher Alkhateeb < [email protected]>wrote:Hi Scott,Thank you for your input. Your ideas are thought provoking and enrichingto the conversation.The way I look at it, the general rule is usually many unit tests, lessintegration tests, lesser functional tests. So we are not excludinganytypes of test, all of them are important in certain areas forcertainpurposes with certain quantity. Usually integration tests are less becauseas you said they just grab more. I like the picture below as ageneralguidelinehttp://i.stack.imgur.com/fjQvQ.pngAs you already mentioned unit tests are useful for the framework. I discovered errors in code that I wrote which I was very very carefulwith. I immediately learned the lesson that humans are not designed tocode,andTDD gives you confidence as you build your code with those short30-60second red-green refactors. I feel much much safer and moreconfidentwriting code that way, the test also documents how to use the api, refactoring and feature change becomes less terrifying. Also messycodeisusually not test friendly thus refactoring and unit tests gohand-in-handfor improving the code base.Also, I am sorry to say that the framework code is rather messy and brittlein many places. I think you probably encountered this yourself. Thesameis said for the applications. Now If we start refactoring without unitteststhen we are back to scary business. So much can go wrong so fast andbreak things you never expected to break. The framework with allapplicationsrequire heavy refactoring of things like massive ugly methods,sandwiched logic, heavy shared mutable state, hidden dependencies, poorinterfaces, and much more. Every time I touch something I get shockedat how bad it looks, spaghetti logic to no end. If you refactor withintegration tests instead of unit tests then you will come down to ascreeching halt as you wait between these test cycles. My computer actuallytakes 10 minutes or more for a full clean load data and testing.Now talking about mocking you raise some interesting points, what canyou mock vs utilizing integration tests? This is an excellent questionthatdoes not have a simple answer, and you mostly learn as you code,difficult to envision without coding. However simple things like Javaservicescan bemocked with a standard mocking class that you use everywhere.Transactionsare difficult to mock and better left to integration tests I think.SECAsmight be mocked by simply passing output to input as chaining methods.Mindyou I am not 100% sure of all of this, coding is the ultimate guidetowhatcan or cannot be done.So I am not suggesting unit tests as a best-practice (even though itis). Instead I suggest it as something that I and others did and got ahugepsychological relief and confidence and comfort from. Swimming incodewithout tests is a terrifying business, made more terrifying if thecode is bad. Short bursts of red/green/red/green makes you feel good as youbuildup your logic. And I don't have an exact vision of how to do it, because the details always win.I look forward to hearing your thoughts and thank you for enriching thisconversation.Taher Alkhateeb On Tuesday, 19 July 2016, Scott Gray <[email protected] wrote:I know I'm late to the party here, but I just want to say that Ithinkintegration tests have far greater value to OFBiz than unittests.Mostlybecause we tend to have quite a low number of tests andintegrationtestsgive us much better coverage per line of test code and the testsaremuch closer to the real world scenarios the application mightencounter.I don't really see how unit tests could be applied tonon-frameworktestingin a useful manner, could you expand on your vision in thatregard?Imeanwould we be testing something smaller than a service as the'unit'?Whatwould we mock? Would transaction management still be active? Whathappens when the service calls another service, I guess we mock the responsefrom that service (how)?It just seems a very complicated method to achieve a less thoroughbutalbeit faster (maybe) test result.A build, data load and full test run takes 4m 9s on my laptop.Excludingbuild, data load and framework tests: the application level tests take35s,not very expensive IMO. The data load time can be reduced topracticallynothing by copying a clean slate database into runtime for each run.I'm mostly just suggesting we be wary of adding complicated testing procedures in the hope of achieving some 'best practice' resultwhichin reality will provide minimal benefits.Regards Scott On 18 July 2016 at 18:57, Taher Alkhateeb < [email protected]<javascript:;>>wrote:Hello Akash,Fantastic, I have a few unit tests almost done to be included inthestartcomponent. I will create a new subtask under OFBIZ-1463 tocommitthetestsso you can use them as a reference if you like to.I also recommend that you follow the same directory structure betweenthe test code and production code. So for example:Production code: framework/start/src/main/java/org/apache/ofbiz/base/startTest code:framework/start/src/test/java/org/apache/ofbiz/base/startThe benefit of this hierarchy is that you can access non-public (packageprotected) methods for testing. This is in fact exactly what I neededto beable to apply some of the tests.Cheers, Taher Alkhateeb On Mon, Jul 18, 2016 at 9:22 AM, Akash Jain < [email protected] <javascript:;>>wrote:Thanks Taher for nice initiative!We are planning to written unit tests to all components under OFBIZ-1463Thanks and Regards-- Akash Jain On Mon, Jul 18, 2016 at 10:36 AM, Taher Alkhateeb < [email protected] <javascript:;>> wrote: Hello Everyone,In reference to this thread and the Jira OFBIZ-7254, I'm veryhappytoannounce that OFBiz is now ready for applying unit testswithonly8newlines of code in the build script (r1753143) :)I recommend we do the following moving forward: 1- Introduce unit tests as much as we can to all components 2- Migrate most of the integration tests we currently have tounittests(since they are designed to do very little integration).This is a great chance for us to practice real TDD in OFBiz Cheers, Taher Alkhateeb On Mon, Jun 13, 2016 at 7:43 AM, Pranay Pandey < [email protected] <javascript:;>> wrote: +1Best regards, Pranay Pandey HotWax Systems http://www.hotwaxsystems.com/ On Fri, Jun 10, 2016 at 7:46 PM, Taher Alkhateeb < [email protected] <javascript:;> wrote:Hello Everyone, I was able to get a few tests running and this is very doable.ButIfaceda big problem in designing the testing frameworkbecauseofANT.The problem----------------The way the build scripts are designed in OFBiz are verycomplex. Amasterfile calls other files which call other files. And inthemiddleyouhaveexternal libraries (ant-contrib) and macros, andvariables,andclasspathdeclarations, and and and ....I cannot declare the tests programmatically (with JUnit testsuites)because this means lower level components would dependon higherlevelcomponents. So I have to do it in ANT, by navigatingthismazeofbuildscripts, and it was a headache for me just to readthem,letalonemodifythem to create a testing framework.Suggested Solution ------------------------ I suggest to implement the testing framework in Gradle, andsimplycallitfrom within ant. This is a middle solution thatsustainsantfornow,butcan allow us to switch out later.This means I will just add one more file called build.gradleinthetoplevel directory, and figure out the business logic forcallingthetestsuites from that fileI look forward to your feedback.Regards, Taher Alkhateeb On Wed, Jun 8, 2016 at 6:00 PM, Taher Alkhateeb < [email protected] <javascript:;>> wrote: Hi Everyone,Thank you all for your support, JIRA created in https://issues.apache.org/jira/browse/OFBIZ-7254 I will start working on it and try to implement ASAP togetmyfocusbackon refactoring.Cheers! Taher Alkhateeb On Wed, Jun 8, 2016 at 4:58 PM, Deepak Dixit < [email protected] <javascript:;>> wrote:+1Thanks & Regards-- Deepak Dixit www.hotwaxsystems.com On Wed, Jun 8, 2016 at 7:12 PM, Mridul Pathak < [email protected] <javascript:;>> wrote:+1Makes perfect sense.-- Thanks & Regards, Mridul Pathak Senior Manager HotWax Systems http://www.hotwaxsystems.com On Jun 8, 2016, at 2:41 PM, Taher Alkhateeb < [email protected] <javascript:;>> wrote: Hello Everyone,After refactoring the start component and while startingonthebasecomponent I realized that the testing frameworkforOFBizisnotgood.Youcannot do real test driven development orred-green-refactorwiththecurrent setup, hence my proposal to change it. Iexplain below:Problem with current design----------------------------------------- What we have right now is not unit tests, it's reallyintegrationtests.You have to start the framework, the database,theserviceengine,theentity engine and pretty much everything.- Testing is very slow, because it's anintegrationtestasImentionedabove. 10 minutes on a good computer!- There is zero mocking! We actually have to --load-dataforthingstowork. Again, these are integration tests.- Too complex: Integration tests by their naturearegrabbingtoomuch.Mind you, I am not objecting to integrationtests(Iactuallylikethem)but I am objecting to not having realunit-tests.Unittestsshouldallrunin a few seconds.Proposed solution -------------------------- - We keep what is considered real integration teststhewaytheyarerightnow and keep using them- We move what should be unit tests into simple JUnitclasses,andwedonot run them using java -jar ofbiz.jar --test,butinsteadrunthemdirectly from the build.xml script, so thesefilesarenotidentifiedinany XML document, but are simply calledimmediatelyfromthebuildscripts.- We clearly mark the difference betweenintegrationtestsandunittests(inside the source files or in the suitedeclarations).- We change the run-tests target in build.xml torunbothunittestsandintegration tests.I intend to heavily refactor the framework and I wouldfeelbetteraboutintroducing this change while refactoring. Whatdoyouguysthink?Ideas?Suggestions? Approvals and thumbs up?Regards, Taher Alkhateeb-- Ron Wheeler President Artifact Software Inc email: [email protected] skype: ronaldmwheeler phone: 866-970-2435, ext 102
-- Ron Wheeler President Artifact Software Inc email: [email protected] skype: ronaldmwheeler phone: 866-970-2435, ext 102
