Re: [testdrivendevelopment] How would you TDD a website front-end?
"Russell Gold" <[email protected]> Sat, 4 Jan 2020 21:09:20 -0500
| Newsgroups | gmane.comp.programming.test-driven-development |
|---|---|
| Message-ID | <[email protected]> |
--Apple-Mail=_04913F22-9081-46F5-AC27-5BADD4DA9A00 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 And that is why UI testing in general needs to be split into tests of the b= usiness logic independently of the UI. UI testing is never going to be all = that fast or easy, but whatever can be automated is much faster than the a= lternative. ----------------- Author, Getting Started with Apache Maven <http://www.packtpub.com/getting= -started-with-apache-maven/video> Author, HttpUnit <http://www.httpunit.org> and SimpleStub <http://simplest= ub.meterware.com> Now blogging at <http://russgold.net/sw/> Have you listened to Edict Zero <https://edictzero.wordpress.com <https://= edictzero.wordpress.com/>>? If not, you don=E2=80=99t know what you=E2=80= =99re missing! > On Jan 4, 2020, at 5:03 PM, Gregory Salvan <[email protected]> wrote: >=20 > Sorry I'm not convinced by all answers, specially when I see end to end = tests, TDD is rapid feedback and "end to end tests" are slow. > To illustrate my feelings, I've found the following article about Cohn p= yramid : https://martinfowler.com/articles/practical-test-pyramid.html <htt= ps://martinfowler.com/articles/practical-test-pyramid.html>=20 > I think tests like the following for example are useless: https://github= .com/hamvocke/spring-testing/blob/master/src/test/java/example/HelloE2ERest= Test.java <https://github.com/hamvocke/spring-testing/blob/master/src/test/= java/example/HelloE2ERestTest.java> > What's the purpose of the test shouldReturnGreeting() ? What is he testi= ng really ?=20 > A different approach can consist in unit testing with small steps hello = method (String hello(@PathVariable final String lastName)), and checking if= "/hello/{lastName}" is mapped to this method. > Which one gives you the fastest feedback ? In case of test break, which = one will permit you to find faster where it's broken ? > Which approach document the best what you're testing ? Look at all the t= ests, what if we want to show last name before first name ? > Don't you feel this kind of test are like "testing the compiler" ? >=20 > The question I try to keep in mind is **"What is my SUT"** ? In this cas= e spring framework is not, you can test it, but in my opinion its outside o= f TDD scope. > +1 to George Dinwiddie answer >=20 > Hope it helps >=20 >=20 >=20 >=20 >=20 >=20 >=20 > Le sam. 4 janv. 2020 =C3=A0 12:57, Ken Mccormack <[email protected]= <mailto:[email protected]>> a =C3=A9crit : > You need to split functions into separate categories - orthogonal concer= ns - not confuse/couple them by end to end flow tests.=20 > > TBH a lot depends on the kind of quality outcomes you are looking for, t= he complexity of your UI-side logic, and the tech skills of your team. >=20 > My guess with Blazor is that this is just standard nunit tests running a= gainst C# models. For the most part, I'd write non-200 tests here, e.g. a = stubs will cover un-happy paths, malformed responses, all classes API error= s, but also things like already created. Other concerns would be tested us= ing functional tests, probably, rather than repeat the same coverage in mul= tiple places. >=20 > But it depends. What is your app about? What is its most complex piece?= Why Blazor, rather than React? Why silo front end tests, do you have a s= eparate API team? What are your QA processes? >=20 > The typical set of application tests might be - >=20 > 1. unit tests to cover UI model logic, and in particular, to emulate er= ror and fault cases=20 > 2. API tests - if you're in a silo, you should be throwing a set of cons= umer tests across each API release, to ensure that your basic assumptions a= ren't broken - if the api code is released independently from the front end= (eg a microservices architecture) you need to pin down your contract by pa= ssing the API team a set of tests to litmus check your expectations are bei= ng met (PACT is one approach that you might try, but frameworks in .net wer= en't very mature and tbh it's easier to roll your own approach, often) > 3. UI automation - a journey test that hits each API once in an end to e= nd flow (eg. place an order) >=20 > The Cohn test pyramid is often used to describe the above - but it is al= so naively misquoted and rarely deeply understood - it says *you have to te= st at all (composition) levels*, and so the pyramid is a reflection of a ty= pical OO composition style (i.e. not all apps will have their tests resembl= e a pyramid, many apps use functional tests, and unit test only negative ca= ses. >=20 > Doing more advanced CD, for example, requires some system design, i.e. c= ontrol and observation code, or the ability to run synthetic transactions a= gainst production. I'd rather do that first than unit test happy paths. In= that situation a simple stub/mockist TDD approach doesn't cut it - but how= far you go depends upon the quality outcomes you're looking to achieve in = terms of deploys per developer per day.=20 >=20 > Kennos >=20 > 3, 2020 at 01:07 AM, Avi Kessner wrote: > I would do it like this: > > User inputs a value > Test local model updated with value. > Form posts model to server. > Test server handles form model and returns expected model. > Force response to the model on the GUI > Test the model has been updated correctly. > Assume GUI updates correctly cause you if you used framework code to alt= er the form. > Otherwise, test your hand written html as if it was a model. >=20 > On Fri, Jan 3, 2020, 03:49 Alan Baljeu via Groups.Io <alanbaljeu=3Dyahoo= [email protected] <mailto:[email protected]>> wrote: > The pattern I have is > > User inputs a value > Form posts value to server > Server responds with new model data. > Form reconfigures. > > "Test changes to the model" then I think means testing the web service. = So don't test the view? > > Alan Baljeu > [email protected] <mailto:[email protected]> > > > > On Thursday, January 2, 2020, 06:58:20 p.m. EST, Avi Kessner <akessner@g= mail.com <mailto:[email protected]>> wrote: > > > Test the changes to the model, not the GUI itself. >=20 > On Fri, Jan 3, 2020, 00:26 George Dinwiddie <[email protected] <ma= ilto:[email protected]>> wrote: > Alan, >=20 > Way back, I played with test-driving AWT and Java Swing UIs, starting=20 > with just jUnit. Given the availability of web driver libraries, you can= = =20 > do similar things much more easily. >=20 > In general, I tested the GUI with a test API to make sure things were=20 > wired up correctly. I tested the actual API to make sure the system=20 > worked correctly. >=20 > In=20 > https://github.com/gdinwiddie/EquineHoroscope/tree/master/src/test/java/= com/gdinwiddie/equinehoroscope/acceptance <https://github.com/gdinwiddie/Eq= uineHoroscope/tree/master/src/test/java/com/gdinwiddie/equinehoroscope/acce= ptance>=20 > you can see an example of re-using a test that drove the API creation to= = =20 > check the same result from the GUI by injecting a different adapter to= =20 > talk with the system under test. >=20 > - George >=20 > > Alan Baljeu > > [email protected] <mailto:[email protected]> > >=20 > >=20 >=20 > --=20 > ---------------------------------------------------------------------- > * George Dinwiddie * http://blog.gdinwiddie.com = <http://blog.gdinwiddie.com/> > Software Development http://www.idiacomputing.com = <http://www.idiacomputing.com/> > Consultant and Coach > ---------------------------------------------------------------------- >=20 >=20 >=20 >=20 > > >=20 >=20 >=20 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#35836): https://groups.io/g/testdrivendevelopment/mess= age/35836 Mute This Topic: https://groups.io/mt/69387056/3268755 Group Owner: [email protected] Unsubscribe: https://groups.io/g/testdrivendevelopment/leave/6156322/74455= 6386/xyzzy [[email protected]] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --Apple-Mail=_04913F22-9081-46F5-AC27-5BADD4DA9A00 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 <html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= = =3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: = space; line-break: after-white-space;" class=3D"">And that is why UI testin= g in general needs to be split into tests of the business logic independent= ly of the UI. UI testing is never going to be all that fast or easy, but wh= atever can be automated is much faster than the alternative.<br class= = =3D""><div class=3D""> <div style=3D"color: rgb(0, 0, 0); letter-spacing: normal; text-align: sta= rt; text-indent: 0px; text-transform: none; white-space: normal; word-spaci= ng: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbs= p-mode: space; -webkit-line-break: after-white-space;" class=3D""><div styl= e=3D"color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-i= ndent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -= webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: sp= ace; -webkit-line-break: after-white-space;" class=3D""><div style=3D"color= : rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px= ; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-tex= t-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webk= it-line-break: after-white-space;" class=3D""><div class=3D""><div style=3D= "orphans: 2; widows: 2;" class=3D"">-----------------</div><div style=3D"or= phans: 2; widows: 2;" class=3D"">Author, Getting Started with Apache M= aven <<a href=3D"http://www.packtpub.com/getting-started-with-apache-mav= en/video" class=3D"">http://www.packtpub.com/getting-started-with-apache-ma= ven/video</a>></div><div style=3D"orphans: 2; widows: 2;" class=3D"">Aut= hor, HttpUnit <<a href=3D"http://www.httpunit.org" class=3D"">http://www= .httpunit.org</a>> and SimpleStub <<a href=3D"http://simplestub.meter= ware.com" class=3D"">http://simplestub.meterware.com</a>><br class=3D"">= Now blogging at <<a href=3D"http://russgold.net/sw/" class=3D"">http://r= ussgold.net/sw/</a>></div><div style=3D"orphans: 2; widows: 2;" class=3D= ""><br class=3D""></div><div style=3D"orphans: 2; widows: 2;" class=3D"">Ha= ve you listened to Edict Zero <<a href=3D"https://edictzero.wordpress.co= m" class=3D"">https://edictzero.wordpress.com</a>>? If not, you don=E2= =80=99t know what you=E2=80=99re missing!</div></div></div><br class=3D"Ap= ple-interchange-newline"></div><br class=3D"Apple-interchange-newline"></di= v><br class=3D"Apple-interchange-newline"><br class=3D"Apple-interchange-ne= wline"> </div> <div><br class=3D""><blockquote type=3D"cite" class=3D""><div class=3D"">O= n Jan 4, 2020, at 5:03 PM, Gregory Salvan <<a href=3D"mailto:apieum@gmai= l.com" class=3D"">[email protected]</a>> wrote:</div><br class=3D"Apple-i= nterchange-newline"><div class=3D""><div dir=3D"ltr" style=3D"caret-color: = rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; = font-variant-caps: normal; font-weight: normal; letter-spacing: normal; tex= t-align: start; text-indent: 0px; text-transform: none; white-space: normal= ; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;= " class=3D""><div class=3D"">Sorry I'm not convinced by all answers, specia= lly when I see end to end tests, TDD is rapid feedback and "end to end test= s" are slow.<br class=3D""></div><div class=3D"">To illustrate my feelings,= I've found the following article about Cohn pyramid :<span class=3D"Apple-= converted-space"> </span><a href=3D"https://martinfowler.com/articles/= practical-test-pyramid.html" class=3D"">https://martinfowler.com/articles/p= ractical-test-pyramid.html</a><span class=3D"Apple-converted-space"> <= /span><br class=3D""></div><div class=3D"">I think tests like the following= for example are useless:<span class=3D"Apple-converted-space"> </span= ><a href=3D"https://github.com/hamvocke/spring-testing/blob/master/src/test= /java/example/HelloE2ERestTest.java" class=3D"">https://github.com/hamvocke= /spring-testing/blob/master/src/test/java/example/HelloE2ERestTest.java</a>= </div><div class=3D""></div><div class=3D"">What's the purpose of the test<= span class=3D"Apple-converted-space"> </span><span class=3D"gmail-pl-e= n">shouldReturnGreeting</span>() ? What is he testing really ? </div><= div class=3D""><span class=3D"gmail-pl-s"><span class=3D"gmail-pl-pds">A di= fferent approach can consist in unit testing with small steps hello method = (</span></span><span class=3D"gmail-pl-smi">String</span><span class=3D"App= le-converted-space"> </span><span class=3D"gmail-pl-en">hello</span>(<= span class=3D"gmail-pl-k">@PathVariable</span><span class=3D"Apple-converte= d-space"> </span><span class=3D"gmail-pl-k">final</span><span class=3D= "Apple-converted-space"> </span><span class=3D"gmail-pl-smi">String</s= pan><span class=3D"Apple-converted-space"> </span><span class=3D"gmail= -pl-v">lastName</span>)<span class=3D"gmail-pl-s"><span class=3D"gmail-pl-p= ds">), and checking if<span class=3D"Apple-converted-space"> </span><s= pan class=3D"Apple-converted-space"> </span><span class=3D"gmail-pl-s"= ><span class=3D"gmail-pl-pds">"</span>/hello/{lastName}<span class=3D"gmail= -pl-pds">" is mapped to this method.<br class=3D""></span></span></span></s= pan></div><div class=3D""><span class=3D"gmail-pl-s"><span class=3D"gmail-p= l-pds"><span class=3D"gmail-pl-s"><span class=3D"gmail-pl-pds"></span></spa= n></span></span></div><div class=3D""><span class=3D"gmail-pl-s"><span clas= s=3D"gmail-pl-pds"></span></span></div><div class=3D""><span class=3D"gmail= -pl-s"><span class=3D"gmail-pl-pds">Which one gives you the fastest feedbac= k ? In case of test break, which one will permit you to find faster where i= t's broken ?<br class=3D""></span></span></div><div class=3D""><span class= =3D"gmail-pl-s"><span class=3D"gmail-pl-pds">Which approach document the b= est what you're testing ? Look at all the tests, what if we want to show la= st name before first name ?<br class=3D""></span></span></div><div class=3D= ""><span class=3D"gmail-pl-s"><span class=3D"gmail-pl-pds">Don't you feel t= his kind of test are like "testing the compiler" ?<br class=3D""></span></s= pan></div><div class=3D""><span class=3D"gmail-pl-s"><span class=3D"gmail-p= l-pds"><br class=3D""></span></span></div><div class=3D""><span class=3D"gm= ail-pl-s"><span class=3D"gmail-pl-pds">The question I try to keep in mind i= s **"What is my SUT"** ? In this case spring framework is not, you can test= it, but in my opinion its outside of TDD scope.<br class=3D""></span></spa= n></div><div class=3D""><span class=3D"gmail-pl-s"><span class=3D"gmail-pl-= pds">+1 to</span></span><span class=3D"Apple-converted-space"> </span>= George Dinwiddie answer<br class=3D""></div><div class=3D""><span class=3D"= gmail-pl-s"><span class=3D"gmail-pl-pds"><br class=3D""></span></span></div= ><div class=3D""><span class=3D"gmail-pl-s"><span class=3D"gmail-pl-pds">Ho= pe it helps<br class=3D""></span></span></div><div class=3D""><span class= =3D"gmail-pl-s"><span class=3D"gmail-pl-pds"><br class=3D""><br class=3D""= ><br class=3D""><br class=3D""></span></span></div><div class=3D""><span cl= ass=3D"gmail-pl-s"><span class=3D"gmail-pl-pds"><br class=3D""><br class=3D= ""></span></span></div></div><br style=3D"caret-color: rgb(0, 0, 0); font-f= amily: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: n= ormal; font-weight: normal; letter-spacing: normal; text-align: start; text= -indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;= -webkit-text-stroke-width: 0px; text-decoration: none;" class=3D""><div cl= ass=3D"gmail_quote" style=3D"caret-color: rgb(0, 0, 0); font-family: Helvet= ica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-w= eight: normal; letter-spacing: normal; text-align: start; text-indent: 0px;= text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text= -stroke-width: 0px; text-decoration: none;"><div dir=3D"ltr" class=3D"gmail= _attr">Le sam. 4 janv. 2020 =C3=A0 12:57, Ken Mccormack <<a hr= ef=3D"mailto:[email protected]" class=3D"">[email protected]</a>&= gt; a =C3=A9crit :<br class=3D""></div><blockquote class=3D"gmail_quot= e" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-= style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;">Yo= u need to split functions into separate categories - orthogonal concerns - = not confuse/couple them by end to end flow tests. <br class=3D""> = ;<br class=3D"">TBH a lot depends on the kind of quality outcomes you = are looking for, the complexity of your UI-side logic, and the tech skills = of your team.<br class=3D""><br class=3D"">My guess with Blazor is that thi= s is just standard nunit tests running against C# models. For the mos= t part, I'd write non-200 tests here, e.g. a stubs will cover un-happy path= s, malformed responses, all classes API errors, but also things like alread= y created. Other concerns would be tested using functional tests, pro= bably, rather than repeat the same coverage in multiple places.<br class=3D= ""><br class=3D"">But it depends. What is your app about? What is its= most complex piece? Why Blazor, rather than React? Why silo fr= ont end tests, do you have a separate API team? What are your QA proc= esses?<br class=3D""><br class=3D"">The typical set of application tests mi= ght be -<br class=3D""><br class=3D"">1. unit tests to cover UI model= logic, and in particular, to emulate error and fault cases <br class= =3D"">2. API tests - if you're in a silo, you should be throwing a set of = consumer tests across each API release, to ensure that your basic assumptio= ns aren't broken - if the api code is released independently from the front= end (eg a microservices architecture) you need to pin down your contract b= y passing the API team a set of tests to litmus check your expectations are= being met (PACT is one approach that you might try, but frameworks in .net= weren't very mature and tbh it's easier to roll your own approach, often)<= br class=3D"">3. UI automation - a journey test that hits each API once in = an end to end flow (eg. place an order)<br class=3D""><br class=3D"">The Co= hn test pyramid is often used to describe the above - but it is also naivel= y misquoted and rarely deeply understood - it says *you have to test at all= (composition) levels*, and so the pyramid is a reflection of a typical OO = composition style (i.e. not all apps will have their tests resemble a pyram= id, many apps use functional tests, and unit test only negative cases.<br c= lass=3D""><br class=3D"">Doing more advanced CD, for example, requires some= system design, i.e. control and observation code, or the ability to run sy= nthetic transactions against production. I'd rather do that first tha= n unit test happy paths. In that situation a simple stub/mockist TDD approa= ch doesn't cut it - but how far you go depends upon the quality outcomes yo= u're looking to achieve in terms of deploys per developer per day. <br= class=3D""><br class=3D"">Kennos<br class=3D""><br class=3D"">3, 2020 at 0= 1:07 AM, Avi Kessner wrote:<br class=3D""><blockquote class=3D""><div dir= =3D"auto" class=3D""><div dir=3D"auto" class=3D"">I would do it like this:= </div><div dir=3D"auto" class=3D""> </div><div class=3D"">User inputs = a value</div><div dir=3D"auto" class=3D"">Test local model updated with val= ue.</div><div dir=3D"auto" class=3D"">Form posts model to server.</div><div= dir=3D"auto" class=3D"">Test server handles form model and returns expecte= d model.</div><div dir=3D"auto" class=3D"">Force response to the model on t= he GUI</div><div dir=3D"auto" class=3D"">Test the model has been updated co= rrectly.</div><div dir=3D"auto" class=3D"">Assume GUI updates correctly cau= se you if you used framework code to alter the form.</div><div dir=3D"auto"= class=3D"">Otherwise, test your hand written html as if it was a model.<br= class=3D""><br class=3D""><div class=3D"gmail_quote" dir=3D"auto"><div cla= ss=3D"gmail_attr" dir=3D"ltr">On Fri, Jan 3, 2020, 03:49 Alan Baljeu via Gr= oups.Io <alanbaljeu=3D<a href=3D"mailto:[email protected]" target=3D"_= blank" class=3D"">[email protected]</a>> wrote:</div><blockquote class= = =3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1p= x; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding= -left: 1ex;"><div class=3D""><div style=3D"font-family: "Helvetica Neu= e", Helvetica, Arial, sans-serif; font-size: 16px;" class=3D""><div cl= ass=3D""><div dir=3D"ltr" class=3D"">The pattern I have is</div><div dir=3D= "ltr" class=3D""> </div><div dir=3D"ltr" class=3D"">User inputs a valu= e</div><div dir=3D"ltr" class=3D"">Form posts value to server</div><div dir= = =3D"ltr" class=3D"">Server responds with new model data.</div><div dir=3D"= ltr" class=3D"">Form reconfigures.</div><div class=3D""> </div><div di= r=3D"ltr" class=3D"">"Test changes to the model" then I think means testing= the web service. So don't test the view?</div><div class=3D""> = </div><div class=3D""><div style=3D"font-family: Helvetica, Arial, sans-ser= if; font-size: 16px;" class=3D""><div style=3D"font-family: Helvetica, Aria= l, sans-serif; font-size: 16px;" class=3D""><div class=3D"">Alan Baljeu</di= v></div><div style=3D"font-family: Helvetica, Arial, sans-serif; font-size:= 16px;" class=3D""><a href=3D"mailto:[email protected]" rel=3D"noopener = noreferrer" target=3D"_blank" class=3D"">[email protected]</a></div><div= style=3D"font-family: Helvetica, Arial, sans-serif; font-size: 16px;" clas= s=3D""> </div></div></div></div><div class=3D""> </div><div class= = =3D""> </div></div><div id=3D"gmail-m_2462695110694953152m_1174070532= 757893286ydp89e51f5yahoo_quoted_8399920580" class=3D""><div style=3D"font-f= amily: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:= 13px; color: rgb(38, 40, 42);" class=3D""><div class=3D"">On Thursday, Jan= uary 2, 2020, 06:58:20 p.m. EST, Avi Kessner <<a href=3D"mailto:akessner= @gmail.com" rel=3D"noopener noreferrer" target=3D"_blank" class=3D"">akessn= [email protected]</a>> wrote:</div><div class=3D""> </div><div class=3D"= "> </div><div class=3D""><div id=3D"gmail-m_2462695110694953152m_11740= 70532757893286ydp89e51f5yiv9185559269" class=3D""><div class=3D""><div clas= s=3D"">Test the changes to the model, not the GUI itself.</div><br clear=3D= "none" class=3D""><div class=3D""><div dir=3D"ltr" class=3D"">On Fri, Jan 3= , 2020, 00:26 George Dinwiddie <<a href=3D"mailto:[email protected]= m" rel=3D"nofollow noopener noreferrer" shape=3D"rect" target=3D"_blank" cl= ass=3D"">[email protected]</a>> wrote:</div><blockquote style=3D"m= argin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid;= border-left-color: rgb(204, 204, 204); padding-left: 1ex;" class=3D"">Alan= ,<br clear=3D"none" class=3D""><br clear=3D"none" class=3D"">Way back, I pl= ayed with test-driving AWT and Java Swing UIs, starting<span class=3D"Apple= -converted-space"> </span><br clear=3D"none" class=3D"">with just jUni= t. Given the availability of web driver libraries, you can<span class=3D"Ap= ple-converted-space"> </span><br clear=3D"none" class=3D"">do similar = things much more easily.<br clear=3D"none" class=3D""><br clear=3D"none" cl= ass=3D"">In general, I tested the GUI with a test API to make sure things w= ere<span class=3D"Apple-converted-space"> </span><br clear=3D"none" cl= ass=3D"">wired up correctly. I tested the actual API to make sure the syste= m<span class=3D"Apple-converted-space"> </span><br clear=3D"none" clas= s=3D"">worked correctly.<br clear=3D"none" class=3D""><br clear=3D"none" cl= ass=3D"">In<span class=3D"Apple-converted-space"> </span><br clear=3D"= none" class=3D""><a href=3D"https://github.com/gdinwiddie/EquineHoroscope/t= ree/master/src/test/java/com/gdinwiddie/equinehoroscope/acceptance" rel=3D"= nofollow noopener noreferrer" shape=3D"rect" target=3D"_blank" class=3D"">h= ttps://github.com/gdinwiddie/EquineHoroscope/tree/master/src/test/java/com/= gdinwiddie/equinehoroscope/acceptance</a><span class=3D"Apple-converted-spa= ce"> </span><br clear=3D"none" class=3D"">you can see an example of re= -using a test that drove the API creation to<span class=3D"Apple-converted-= space"> </span><br clear=3D"none" class=3D"">check the same result fro= m the GUI by injecting a different adapter to<span class=3D"Apple-converted= -space"> </span><br clear=3D"none" class=3D"">talk with the system und= er test.<br clear=3D"none" class=3D""><br clear=3D"none" class=3D""> <= span class=3D"Apple-converted-space"> </span>- George<br clear=3D"none= " class=3D""><br clear=3D"none" class=3D"">> Alan Baljeu<br clear=3D"non= e" class=3D"">><span class=3D"Apple-converted-space"> </span><a hre= f=3D"mailto:[email protected]" rel=3D"nofollow noopener noreferrer" shap= e=3D"rect" target=3D"_blank" class=3D"">[email protected]</a><br clear= =3D"none" class=3D"">><span class=3D"Apple-converted-space"> </spa= n><br clear=3D"none" class=3D"">><span class=3D"Apple-converted-space">&= nbsp;</span><br clear=3D"none" class=3D""><br clear=3D"none" class=3D"">--<= span class=3D"Apple-converted-space"> </span><br clear=3D"none" class= =3D""> <span class=3D"Apple-converted-space"> </span>-----------= -----------------------------------------------------------<br clear=3D"non= e" class=3D""> * George Dinwiddie * = <span class=3D"Apple-conver= ted-space"> </span><a href=3D"http://blog.gdinwiddie.com/" rel=3D"nofo= llow noopener noreferrer" shape=3D"rect" target=3D"_blank" class=3D"">http:= //blog.gdinwiddie.com</a><br clear=3D"none" class=3D""> Softwar= e Development = <span class=3D"Apple-converted-space"> </span><a href=3D"http:/= /www.idiacomputing.com/" rel=3D"nofollow noopener noreferrer" shape=3D"rect= " target=3D"_blank" class=3D"">http://www.idiacomputing.com</a><br clear=3D= "none" class=3D""> Consultant and Coach<br clear=3D"none" class= = =3D""> <span class=3D"Apple-converted-space"> </span>-----------= -----------------------------------------------------------<br clear=3D"non= e" class=3D""><br clear=3D"none" class=3D""><br clear=3D"none" class=3D""><= br clear=3D"none" class=3D""><br clear=3D"none" class=3D""></blockquote></d= iv></div></div></div></div></div></div><div class=3D""> <br class=3D"w= ebkit-block-placeholder"></div><div class=3D""> <br class=3D"webkit-bl= ock-placeholder"></div></blockquote></div></div></div></blockquote><div cla= ss=3D""><br class=3D"webkit-block-placeholder"></div><div class=3D""><br cl= ass=3D"webkit-block-placeholder"></div></blockquote></div></div></blockquot= e></div><br class=3D""></body></html> <div width=3D"1" style=3D"color:white;clear:both">_._,_._,_</div> <hr> Groups.io Links:<p> You receive all messages sent to this group. <p> <a target=3D"_blank" href=3D"https://groups.io/g/testdrivendevelopment/mes= sage/35836">View/Reply Online (#35836)</a> | <a target=3D"_blank" href=3D"mailto:[email protected]?subj= ect=3DRe:%20Re%3A%20%5Btestdrivendevelopment%5D%20How%20would%20you%20TDD%2= 0a%20website%20front-end%3F">Reply To Group</a> | <a target=3D"_blank" href=3D"mailto:[email protected]?subject=3DPr= ivate:%20Re:%20Re%3A%20%5Btestdrivendevelopment%5D%20How%20would%20you%20TD= D%20a%20website%20front-end%3F">Reply To Sender</a> | <a target=3D"_blank" href=3D"https://groups.io/mt/69387056/3268755">Mu= te This Topic</a> | <a href=3D"https://groups.io/g/testdrivendevelopment/post">New Topic</a>= <br> <br> <a href=3D"https://groups.io/g/testdrivendevelopment/editsub/3268755">Your= Subscription</a> | <a href=3D"mailto:[email protected]">Contact Group Own= er</a> | <a href=3D"https://groups.io/g/testdrivendevelopment/leave/6156322/7445563= 86/xyzzy">Unsubscribe</a> [[email protected]]<br> <div width=3D"1" style=3D"color:white;clear:both">_._,_._,_</div> --Apple-Mail=_04913F22-9081-46F5-AC27-5BADD4DA9A00--