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" <scott.g...@hotwaxsystems.com> 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 basic java > app. I just think the value proposition might decrease the further up the > stack we move with them. I'm not against unit tests when they prove > useful, but further up the stack I think we should prove the case for them > before doing much work to support the mocking that will be required to keep > them 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 I > think it's worth looking into before we declare that unit tests are the > best form of testing for OFBiz. > > Regards > Scott > > On 19 July 2016 at 17:37, Taher Alkhateeb <slidingfilame...@gmail.com> > wrote: > > > Hi Scott, > > > > Thank you for the feedback. To be focused exactly on integration vs > unit, I > > already mentioned above that at least for me the main objective is to > > confidently and quickly run the tests in short bursts of red-green > > refactor. This allows me to refactor code without waiting in front of the > > screen in between test cycles thus giving me immediate feedback on any > > errors I made. Perhaps my intro was too long so this is the squeezed out > > version of it. > > > > I already had one round of testing in the start component which was much > > faster that way and had an immediate impact. Oh and by the way, you > cannot > > test the start component with integration tests for example unless you do > > it from an external component which cannot access package protected > items. > > > > This style of coding is applicable I think to any software project > > inclusive of OFBiz. Maybe in certain components more than others or > certain > > areas more than others. But I can't see how it could be bad or unwanted. > > > > Taher Alkhateeb > > > > On Jul 19, 2016 8:18 AM, "Scott Gray" <scott.g...@hotwaxsystems.com> > > wrote: > > > > > Thanks Ron and Taher for your responses, I appreciate them but I don't > > hear > > > much in the conversation that speaks to the value of unit tests over > > > integration tests. Most of the thoughts shared speaks more to the > value > > of > > > 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 > > than > > > unit tests and just as useful for TDD. > > > I'm not sure if I missed any other points raised regarding integration > > vs. > > > unit tests? > > > > > > I'm not looking to start a big long debate on the topic, I just wanted > to > > > speak out that someone out there (me) doesn't think unit tests are the > > best > > > solution for testing OFBiz applications. > > > > > > Regards > > > Scott > > > > > > On 19 July 2016 at 16:52, Taher Alkhateeb <slidingfilame...@gmail.com> > > > wrote: > > > > > > > Hi Scott, > > > > > > > > Thank you for your input. Your ideas are thought provoking and > > enriching > > > to > > > > the conversation. > > > > > > > > The way I look at it, the general rule is usually many unit tests, > less > > > > integration tests, lesser functional tests. So we are not excluding > any > > > > types of test, all of them are important in certain areas for certain > > > > purposes with certain quantity. Usually integration tests are less > > > because > > > > as you said they just grab more. I like the picture below as a > general > > > > guideline > > > > > > > > http://i.stack.imgur.com/fjQvQ.png > > > > > > > > As you already mentioned unit tests are useful for the framework. I > > > > discovered errors in code that I wrote which I was very very careful > > > with. > > > > I immediately learned the lesson that humans are not designed to > code, > > > and > > > > TDD gives you confidence as you build your code with those short > 30-60 > > > > second red-green refactors. I feel much much safer and more confident > > > > writing code that way, the test also documents how to use the api, > > > > refactoring and feature change becomes less terrifying. Also messy > code > > > is > > > > usually not test friendly thus refactoring and unit tests go > > hand-in-hand > > > > for improving the code base. > > > > > > > > Also, I am sorry to say that the framework code is rather messy and > > > brittle > > > > in many places. I think you probably encountered this yourself. The > > same > > > is > > > > said for the applications. Now If we start refactoring without unit > > tests > > > > then we are back to scary business. So much can go wrong so fast and > > > break > > > > things you never expected to break. The framework with all > applications > > > > require heavy refactoring of things like massive ugly methods, > > sandwiched > > > > logic, heavy shared mutable state, hidden dependencies, poor > > > > interfaces, and much more. Every time I touch something I get shocked > > at > > > > how bad it looks, spaghetti logic to no end. If you refactor with > > > > integration tests instead of unit tests then you will come down to a > > > > screeching halt as you wait between these test cycles. My computer > > > actually > > > > takes 10 minutes or more for a full clean load data and testing. > > > > > > > > Now talking about mocking you raise some interesting points, what can > > you > > > > mock vs utilizing integration tests? This is an excellent question > that > > > > does not have a simple answer, and you mostly learn as you code, > > > difficult > > > > to envision without coding. However simple things like Java services > > can > > > be > > > > mocked with a standard mocking class that you use everywhere. > > > Transactions > > > > are difficult to mock and better left to integration tests I think. > > SECAs > > > > might be mocked by simply passing output to input as chaining > methods. > > > Mind > > > > you I am not 100% sure of all of this, coding is the ultimate guide > to > > > what > > > > can or cannot be done. > > > > > > > > So I am not suggesting unit tests as a best-practice (even though it > > is). > > > > Instead I suggest it as something that I and others did and got a > huge > > > > psychological relief and confidence and comfort from. Swimming in > code > > > > without tests is a terrifying business, made more terrifying if the > > code > > > is > > > > bad. Short bursts of red/green/red/green makes you feel good as you > > build > > > > up 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 > > this > > > > conversation. > > > > > > > > Taher Alkhateeb > > > > > > > > On Tuesday, 19 July 2016, Scott Gray <scott.g...@hotwaxsystems.com> > > > wrote: > > > > > > > > > I know I'm late to the party here, but I just want to say that I > > think > > > > > integration tests have far greater value to OFBiz than unit tests. > > > > Mostly > > > > > because we tend to have quite a low number of tests and integration > > > tests > > > > > give us much better coverage per line of test code and the tests > are > > > much > > > > > closer to the real world scenarios the application might encounter. > > > > > > > > > > I don't really see how unit tests could be applied to non-framework > > > > testing > > > > > in a useful manner, could you expand on your vision in that regard? > > I > > > > mean > > > > > would we be testing something smaller than a service as the 'unit'? > > > What > > > > > would we mock? Would transaction management still be active? What > > > happens > > > > > when the service calls another service, I guess we mock the > response > > > from > > > > > that service (how)? > > > > > > > > > > It just seems a very complicated method to achieve a less thorough > > but > > > > > albeit faster (maybe) test result. > > > > > > > > > > A build, data load and full test run takes 4m 9s on my laptop. > > > Excluding > > > > > build, data load and framework tests: the application level tests > > take > > > > 35s, > > > > > not very expensive IMO. The data load time can be reduced to > > > practically > > > > > nothing 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' result > which > > > in > > > > > reality will provide minimal benefits. > > > > > > > > > > Regards > > > > > Scott > > > > > > > > > > On 18 July 2016 at 18:57, Taher Alkhateeb < > > slidingfilame...@gmail.com > > > > > <javascript:;>> > > > > > wrote: > > > > > > > > > > > Hello Akash, > > > > > > > > > > > > Fantastic, I have a few unit tests almost done to be included in > > the > > > > > start > > > > > > component. I will create a new subtask under OFBIZ-1463 to commit > > the > > > > > tests > > > > > > so you can use them as a reference if you like to. > > > > > > > > > > > > I also recommend that you follow the same directory structure > > between > > > > the > > > > > > test code and production code. So for example: > > > > > > > > > > > > Production code: > > > > > framework/start/src/main/java/org/apache/ofbiz/base/start > > > > > > Test code: > > framework/start/src/test/java/org/apache/ofbiz/base/start > > > > > > > > > > > > The benefit of this hierarchy is that you can access non-public > > > > (package > > > > > > protected) methods for testing. This is in fact exactly what I > > needed > > > > to > > > > > be > > > > > > able to apply some of the tests. > > > > > > > > > > > > Cheers, > > > > > > > > > > > > Taher Alkhateeb > > > > > > > > > > > > On Mon, Jul 18, 2016 at 9:22 AM, Akash Jain < > > > > > akash.j...@hotwaxsystems.com <javascript:;>> > > > > > > wrote: > > > > > > > > > > > > > Thanks Taher for nice initiative! > > > > > > > > > > > > > > We are planning to written unit tests to all components under > > > > > OFBIZ-1463 > > > > > > > > > > > > > > Thanks and Regards > > > > > > > -- > > > > > > > Akash Jain > > > > > > > > > > > > > > On Mon, Jul 18, 2016 at 10:36 AM, Taher Alkhateeb < > > > > > > > slidingfilame...@gmail.com <javascript:;>> wrote: > > > > > > > > > > > > > > > Hello Everyone, > > > > > > > > > > > > > > > > In reference to this thread and the Jira OFBIZ-7254, I'm very > > > happy > > > > > to > > > > > > > > announce that OFBiz is now ready for applying unit tests with > > > only > > > > 8 > > > > > > new > > > > > > > > lines 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 to > > > unit > > > > > > tests > > > > > > > > (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 < > > > > > > > > pranay.pan...@hotwaxsystems.com <javascript:;>> wrote: > > > > > > > > > > > > > > > > > +1 > > > > > > > > > > > > > > > > > > Best regards, > > > > > > > > > > > > > > > > > > Pranay Pandey > > > > > > > > > HotWax Systems > > > > > > > > > http://www.hotwaxsystems.com/ > > > > > > > > > > > > > > > > > > On Fri, Jun 10, 2016 at 7:46 PM, Taher Alkhateeb < > > > > > > > > > slidingfilame...@gmail.com <javascript:;> > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > Hello Everyone, > > > > > > > > > > > > > > > > > > > > I was able to get a few tests running and this is very > > > doable. > > > > > But > > > > > > I > > > > > > > > > faced > > > > > > > > > > a big problem in designing the testing framework because > of > > > > ANT. > > > > > > > > > > > > > > > > > > > > The problem > > > > > > > > > > ---------------- > > > > > > > > > > The way the build scripts are designed in OFBiz are very > > > > > complex. A > > > > > > > > > master > > > > > > > > > > file calls other files which call other files. And in the > > > > middle > > > > > > you > > > > > > > > have > > > > > > > > > > external libraries (ant-contrib) and macros, and > variables, > > > and > > > > > > class > > > > > > > > > path > > > > > > > > > > declarations, and and and .... > > > > > > > > > > > > > > > > > > > > I cannot declare the tests programmatically (with JUnit > > test > > > > > > suites) > > > > > > > > > > because this means lower level components would depend on > > > > higher > > > > > > > level > > > > > > > > > > components. So I have to do it in ANT, by navigating this > > > maze > > > > of > > > > > > > build > > > > > > > > > > scripts, and it was a headache for me just to read them, > > let > > > > > alone > > > > > > > > modify > > > > > > > > > > them to create a testing framework. > > > > > > > > > > > > > > > > > > > > Suggested Solution > > > > > > > > > > ------------------------ > > > > > > > > > > I suggest to implement the testing framework in Gradle, > and > > > > > simply > > > > > > > call > > > > > > > > > it > > > > > > > > > > from within ant. This is a middle solution that sustains > > ant > > > > for > > > > > > now, > > > > > > > > but > > > > > > > > > > can allow us to switch out later. > > > > > > > > > > > > > > > > > > > > This means I will just add one more file called > > build.gradle > > > in > > > > > the > > > > > > > top > > > > > > > > > > level directory, and figure out the business logic for > > > calling > > > > > the > > > > > > > test > > > > > > > > > > suites from that file > > > > > > > > > > > > > > > > > > > > I look forward to your feedback. > > > > > > > > > > > > > > > > > > > > Regards, > > > > > > > > > > > > > > > > > > > > Taher Alkhateeb > > > > > > > > > > > > > > > > > > > > On Wed, Jun 8, 2016 at 6:00 PM, Taher Alkhateeb < > > > > > > > > > > slidingfilame...@gmail.com <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 to > > get > > > > my > > > > > > > focus > > > > > > > > > back > > > > > > > > > > > on refactoring. > > > > > > > > > > > > > > > > > > > > > > Cheers! > > > > > > > > > > > > > > > > > > > > > > Taher Alkhateeb > > > > > > > > > > > > > > > > > > > > > > On Wed, Jun 8, 2016 at 4:58 PM, Deepak Dixit < > > > > > > > > > > > deepak.di...@hotwaxsystems.com <javascript:;>> wrote: > > > > > > > > > > > > > > > > > > > > > >> +1 > > > > > > > > > > >> > > > > > > > > > > >> Thanks & Regards > > > > > > > > > > >> -- > > > > > > > > > > >> Deepak Dixit > > > > > > > > > > >> www.hotwaxsystems.com > > > > > > > > > > >> > > > > > > > > > > >> On Wed, Jun 8, 2016 at 7:12 PM, Mridul Pathak < > > > > > > > > > > >> mridul.pat...@hotwaxsystems.com <javascript:;>> > wrote: > > > > > > > > > > >> > > > > > > > > > > >> > +1 > > > > > > > > > > >> > > > > > > > > > > > >> > Makes perfect sense. > > > > > > > > > > >> > > > > > > > > > > > >> > -- > > > > > > > > > > >> > Thanks & Regards, > > > > > > > > > > >> > Mridul Pathak > > > > > > > > > > >> > Senior Manager > > > > > > > > > > >> > HotWax Systems > > > > > > > > > > >> > http://www.hotwaxsystems.com > > > > > > > > > > >> > > > > > > > > > > > >> > > On Jun 8, 2016, at 2:41 PM, Taher Alkhateeb < > > > > > > > > > > >> slidingfilame...@gmail.com <javascript:;>> > > > > > > > > > > >> > wrote: > > > > > > > > > > >> > > > > > > > > > > > > >> > > Hello Everyone, > > > > > > > > > > >> > > > > > > > > > > > > >> > > After refactoring the start component and while > > > starting > > > > > on > > > > > > > the > > > > > > > > > base > > > > > > > > > > >> > > component I realized that the testing framework > for > > > > OFBiz > > > > > is > > > > > > > not > > > > > > > > > > good. > > > > > > > > > > >> > You > > > > > > > > > > >> > > cannot do real test driven development or > > > > > red-green-refactor > > > > > > > > with > > > > > > > > > > the > > > > > > > > > > >> > > current setup, hence my proposal to change it. I > > > explain > > > > > > > below: > > > > > > > > > > >> > > > > > > > > > > > > >> > > Problem with current design > > > > > > > > > > >> > > ---------------------------------------- > > > > > > > > > > >> > > - What we have right now is not unit tests, it's > > > really > > > > > > > > > integration > > > > > > > > > > >> > tests. > > > > > > > > > > >> > > You have to start the framework, the database, the > > > > service > > > > > > > > engine, > > > > > > > > > > the > > > > > > > > > > >> > > entity engine and pretty much everything. > > > > > > > > > > >> > > - Testing is very slow, because it's an > integration > > > test > > > > > as > > > > > > I > > > > > > > > > > >> mentioned > > > > > > > > > > >> > > above. 10 minutes on a good computer! > > > > > > > > > > >> > > - There is zero mocking! We actually have to > > > --load-data > > > > > for > > > > > > > > > things > > > > > > > > > > to > > > > > > > > > > >> > > work. Again, these are integration tests. > > > > > > > > > > >> > > - Too complex: Integration tests by their nature > are > > > > > > grabbing > > > > > > > > too > > > > > > > > > > >> much. > > > > > > > > > > >> > > Mind you, I am not objecting to integration tests > (I > > > > > > actually > > > > > > > > like > > > > > > > > > > >> them) > > > > > > > > > > >> > > but I am objecting to not having real unit-tests. > > Unit > > > > > tests > > > > > > > > > should > > > > > > > > > > >> all > > > > > > > > > > >> > run > > > > > > > > > > >> > > in a few seconds. > > > > > > > > > > >> > > > > > > > > > > > > >> > > Proposed solution > > > > > > > > > > >> > > -------------------------- > > > > > > > > > > >> > > - We keep what is considered real integration > tests > > > the > > > > > way > > > > > > > they > > > > > > > > > are > > > > > > > > > > >> > right > > > > > > > > > > >> > > now and keep using them > > > > > > > > > > >> > > - We move what should be unit tests into simple > > JUnit > > > > > > classes, > > > > > > > > and > > > > > > > > > > we > > > > > > > > > > >> do > > > > > > > > > > >> > > not run them using java -jar ofbiz.jar --test, but > > > > instead > > > > > > run > > > > > > > > > them > > > > > > > > > > >> > > directly from the build.xml script, so these files > > are > > > > not > > > > > > > > > > identified > > > > > > > > > > >> in > > > > > > > > > > >> > > any XML document, but are simply called > immediately > > > from > > > > > the > > > > > > > > build > > > > > > > > > > >> > scripts. > > > > > > > > > > >> > > - We clearly mark the difference between > integration > > > > tests > > > > > > and > > > > > > > > > unit > > > > > > > > > > >> tests > > > > > > > > > > >> > > (inside the source files or in the suite > > > declarations). > > > > > > > > > > >> > > - We change the run-tests target in build.xml to > run > > > > both > > > > > > unit > > > > > > > > > tests > > > > > > > > > > >> and > > > > > > > > > > >> > > integration tests. > > > > > > > > > > >> > > > > > > > > > > > > >> > > I intend to heavily refactor the framework and I > > would > > > > > feel > > > > > > > > better > > > > > > > > > > >> about > > > > > > > > > > >> > > introducing this change while refactoring. What do > > you > > > > > guys > > > > > > > > think? > > > > > > > > > > >> Ideas? > > > > > > > > > > >> > > Suggestions? Approvals and thumbs up? > > > > > > > > > > >> > > > > > > > > > > > > >> > > Regards, > > > > > > > > > > >> > > > > > > > > > > > > >> > > Taher Alkhateeb > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >