Monday, April 22, 2019

#CodeConfident: Rest Practice

My second #CodeConfident challenge is finally done! It was all about RESTful services. Here's my coding journal, as raw as it is.

March 3


March 4


March 5

  • decided to follow a tutorial to create own REST service, then test it with Rest Assured: https://spring.io/guides/tutorials/bookmarks/ This way I will not only learn how to use the library, but gain a deeper understanding how RESTful services are built
  • also, it's only one step further into the learning zone, as the tech stack is still familiar
  • set up base project using Spring Initializr; added Serenity and REST Assured dependencies; adapted license and readme files
  • created new GitHub repo, cloned it, committed base project, configured repo

March 6


March 9


March 11


March 12

  • pairing session with Amitai Schleier
  • we walked through the project, I explained my reasoning behind
  • Amitai: the build step includes test, that comes unexpected
  • found the included Gradle wrapper was not executable, marked it as such
  • we had to add the Lombok annotation to the classpath; this came unexpected, did not already come with the repo or Gradle; we deferred identifying the root cause here; was a great reminder to run a project locally on a fresh computer from time to time to see what's missing
  • Amitai: shared he would desire fast tests that can run without the app running, just triggered by a key stroke; however, this comes from the perspective of test driving an app, we're in a different context here
  • we learned that the extract method was not instantly comprehensible, not clear what it's doing
  • learned about fluent interfaces (see https://en.wikipedia.org/wiki/Fluent_interface); Amitai: they are nicely readable but might not be instantly comprehensible
  • we both shared concerns like: do we really need to have multiple given/when/thens in a test when we only want to test one action? How to make sure the deletion test really deleted the record, e.g. by calling it again? How can we declare the base path in a nice way at one place?
  • what to test for in which test? Amitai: in general he is thinking of what if this test fails, how hard do I have to think? When it goes red, how obvious is it what I have to do?
  • Amitai: uses the following principle when it comes to tests: make it work, make it right, make it fast
  • Amitai: using auto-format on save a lot; uses a plugin for Intellij: "Save Actions"
  • we committed several changes together throughout the session :)
  • we left TODOs in the code to make it obvious for any one else what's troubling and what is still worked on
  • learned several IntelliJ shortcuts (for MacOS): that were new to me:
    • cmd+9: toggle version control tool window; then cmd+D: on versioned file shows the diff
    • option+cmd+K: commit (& push)
    • option+P: push
    • option+Up/Down: extend / shrink selection
    • after test run, double-click on test lets us jump to the test
  • retrospective:
    • Amitai: already shared his feelings throughout; that was one key learning for him after all the coaching and pairing and mobbing: we don't have to wait to talk about it later, we can talk about it now
    • we were feeling the same pain; how much do we have to say to set up a test; it's a screenful and shouldn't be --> could improve it a bit by reformatting and extracting the test data setup in a separate private helper method (did so); this matters as a test should be so simple that we don't need a test for it; it's supposed to serve us
    • Amitai in general does like the given / when / then structure
    • learned about "TDD as if you meant it" as subcategory; implement class inside test until you come across the first business object (see https://cumulative-hypotheses.org/2011/08/30/tdd-as-if-you-meant-it/)
    • we shared similar concerns, like what does the test actually do, test the test, add assertion that content was actually deleted, multiple given when then steps, test setup, etc.
    • we didn't use a timer, pairing was fluent, frequently switched, quite natural; we both thought of addressing it but decided to give it a go and it worked well
    • I really learned a lot, curious to see how different people tackle different problems, which issues do they see, how they debug and find solutions; e.g. Amitai explored using code and the tests, would have used Postman rather as last resort to find out the behavior
    • love the hands-on approach, already improved things right now, have more pointers what to improve next
  • TODO: think about formatter, start using the plugin
  • TODO: build step includes test
  • TODO: see TODOS in the code ;)

March 12 (cont)

  • realized when summarizing the results from the coding session that pushing from my laptop revealed my work email address; and this time we pushed 3 times, so I could not only amend the last commit like I did before (see https://www.git-tower.com/learn/git/faq/change-author-name-email)
  • this time I had to rebase and edit the commits; above link showed how to do it:
    git rebase -i -p 4f72861fe2fbee02da716f3442cec263e762b4b6
    git commit --amend --author="lisihocke " --no-edit
    git rebase --continue
  • problem: I pushed and merged, and new commits had been created, but the old ones were still there!
  • rebased again and tried to drop these commits, but push did not do anything
  • learned I need to drop them and then force push to replace the remote repo with my local one, this finally did the trick and the concerned commits are gone; feeling relieved!
    git push -f
  • lesson learned, for the second time: be careful what you push..

March 18

  • pairing session with Toyer Mamoojee
  • walked him through the project, explained the reasoning behind, the targeted scope, steps taken so far, open questions
  • we agreed to review what is there for our first session and later have the option to try a different test framework and/or do performance/load testing
  • Toyer: first observation: usually we have test only one endpoint per file
  • naming conventions for tests: have to agree with the team on that, yet should be consistent; Toyer: test name should include what you are testing for, "getEmployee" feels not enough, better "getEmployeeDetails"; also, there's a mixture right now with using "get" for reading or receiving information and "create" for posting
  • Toyer: current test setup class might be sufficient for a practice project for now; would normally have the config in a separate file
  • Toyer: the smoke test looks fine; what they usually do is to additionally include a test for the structure, data types, i.e. including contract testing here as well already
  • Toyer: get first employee: are you sure this id exists? would extract it as constant; for test data setup they are using a separate database that can be queried, I could think about a catalog here; data should be built somewhere else to avoid duplication, in a different class generating the payload; building the payload might be more elegant as well, instead of adding properties I might create a map; creating it upfront to ensure independence makes sense; maybe can include randomizer here as well to detect more issues
  • Toyer: getting information out of the response becomes impossible when you have asynchronous APIs that only return a 200, then you have to query another system
  • Toyer: what else I could test for is that only 1 record is created instead of 2, checking the count of what comes back
  • maybe I could also check if the generated id is not null
  • Toyer: consider splitting tests based on risk; create itself might be crucial and working, only the details might be wrong
  • TODO: revise project based on suggestions

March 27


April 21

  • took up challenge again after a longer period of travels and conferences
  • removed superfluous semicolon (bothered me ever since I detected it and did not find the time to remove it earlier)
  • thought about running the Spring app together with the tests so you don't have to start the app in advance for the tests, like it's done for Restful Booker Platform; decided that this is out of scope for this challenge, would be interesting for a real app though
  • renamed request body to payload
  • potential for future: REST Assured can convert back to Java objects, don't need JSON
  • ran with coverage, however nothing found covered; learned I need to run the tests on the same JVM for it to work, see https://groups.google.com/forum/#!topic/rest-assured/pzBJQqtkvS0 and https://blog.jayway.com/2014/07/04/integration-testing-a-spring-boot-application/ also, need to run as JUnit not as Gradle task it seems
  • doing so I got the error "Error running 'EmployeeTests': Command line is too long. Shorten command line for EmployeeTests or also for JUnit default configuration." --> this fixed it: https://devis.cool/quick-fix/quickfix-intellij-idea-command-line-is-too-long-shorten-command-line-for/
  • still, no coverage found; assume I still need the same JVM; using the Serenity Runner cannot run in same JVM, also issues with SpringRunner
  • interesting post: https://medium.com/@manu.me/bdd-simplified-with-springboot-b56ffdcadb2b
  • did not work so far; also having bootRun as pre-step for test did not trigger tests; however: it's okay to not solve everything in this scope
  • stopped, started Test Automation University course by Bas Dijkstra that I wanted to do for so long already: "Automating your API tests with REST Assured" --> filled several knowledge gaps I had and was not aware of - awesome course!!
  • added checks for content type
  • this way found out how to test for the response content of plain text responses
  • observation: by distracting myself / getting my mind to focus on different but related things (the course) I could solve other issues I had before; was really worth it to "unstuck" myself
  • added test for updating an employee record
  • considering the challenge scope officially done; I'm up for the next challenge! :)

By the way...

First: I learned once again that others appreciate the idea of keeping coding journals as well for their own learning.
Second: I did not have to pause my code-confident challenge yet! I've now indeed continued playing a non-casual computer game at least once a week, and it feels great. Definitely worth following my passion and carving out time for it!

Third: My feeling is I have to speed up. Only two challenges of five completed, let alone my final proof of concept app.

Last but not least: I've been pretty busy the last weeks. The good thing: although I could not work on my personal challenges, I still practiced! I've attended Automation in Testing, TestBash Brighton and Mob Programming Conference. A lot was hands-on learning which I really appreciate. Also, I can't but share one of my absolute highlights with you! Thank you Angie Jones for your encouragement, you're the best!

Code-Confident at TestBash Manchester

Remember when I submitted to Test.bash(); in the last hour? Well, I did not exactly get accepted for this very technical format - yet they selected me for TestBash Manchester! Simply couldn't say no to that. So, I will have yet another challenge this year: craft a presentation out of my ongoing challenge. Already playing with some ideas in my head, curious how they will work out with an audience! :)

Monday, April 15, 2019

Mob Programming Conference 2019 - A Comeback

Remember my joy last year when I got invited to the Mob Programming Conference 2018 as a moberator for the first time? Imagine my joy when Woody Zuill invited me back again for this year's conference! Truth be told, I wholeheartedly hoped for this opportunity and booked my flights for the preceding TestBash Brighton accordingly, allowing me to fly to Boston shortly afterwards.

So, here I was, back in Boston, seeing so many lovely people again, and getting to know many more. It was a wonderful experience. Here's a glimpse into what happened.

Arriving

When I learned that Lennart Fridén would be back on board, I was super happy. We met last year and had some great conversations together, already on the very first evening. This time we could continue, meeting for dinner on the evening for the conference. A wonderful way to get into conference spirit!

The Conference

The first day was kicked off by the amazing Linda Rising with her keynote "Experiments: the Good, the Bad, and the Beautiful". It's always a pleasure to listen to Linda's thoughtful and inspiring talks! She's a real master on stage, and a huge role model as well.
Afterwards it was my time to facilitate a mob session. This year I chose the topic of "Mob Exploratory Testing", evolving a workshop I gave both for another company on my last year's Testing Tour, as well as my own company just recently as a cross-team, cross-role, cross-location mob. It went well and also triggered many new ideas how to improve my mob sessions further. Mission accomplished!
After lunch it was time for a  lean coffee session. I found myself helping out as facilitator at a table full of co-workers. That really made me think how to encourage people better to spread out and learn from other people's experiences. I get why we prefer to stick together, and yet it feels like a missed opportunity at conferences. On the other hand: this experience proved again why a lean coffee session still makes total sense to have in your own company as well. People came from different teams and learned a lot about each other's challenges and solutions they had no idea about before.

For the afternoon I chose the mob session hold by Chris Lucian from Hunter Industries, where the "original" mob evolved. He introduced us to the "Mob Programming Roleplaying Game - A Powerful Learning Experience". It was developed by Willem Larsen and all material can be found on GitHub for people to give it a try themselves. What I really liked about it: the purpose is to show good behaviors in a mob and thus level up your mobbing skills.

The second day started with a great keynote by Karin Tenelius: "Learning from Self-Managing Organizations". What an impressive journey she is on for a long time now! Karin gathered lots of data why self-managing organizations area win-win for everyone. By the way: I loved the fact that both keynotes were given by strong, knowledgeable, inspiring women. True role models, again.
Next up I chose the mob session by Colin Snyder: "When The Mob Encounters 'The New'". He jumped in as replacement for Lisa Crispin and Stephen Vance who unfortunately could not make it to the conference and were dearly missed. I liked Colin's idea of learning something new together as I used this topic myself several times for mob sessions so far. Our little mob ended up in doing first steps in Pearl by doing a coding kata together. Paying nicely into my #CodeConfident challenge! ;-)

After lunch I was very tired, so I spontaneously decided to skip the open space and instead talk with Andrea Zuill and Lennart. What a wonderful, re-energizing and inspiring conversation! One thing that stuck with me after talking with Andrea, who is a children's book author and illustrator: Sometimes it takes a ton of sketches to get a character right. So draw many sketches quickly without trying to improve any of them; instead, instantly move to the next one. If sketches are too refined, they are not sketches anymore ;-) Wise advice and applicable to other areas of life as well.

The last session I chose was Scott Ford's "Mob Programming with Legacy Code". He used the Gilded Rose refactoring kata translated to many different languages by Emily Bache. A wonderful exercise I got first introduced to by Maaret Pyhäjärvi's awesome talk at Selenium Conf India 2018. Alternatively, check out her blog post "Exploring Gilded Rose".

The Social Side of Conferences

I learn a lot from the content shared at conferences in talks and workshops. I learn even more when doing things hands-on together with other people. That's not everything, however. Often I take the most things away from the socializing opportunities offered by or evolving around conferences. Like the evening reception after the first day. Great conversations throughout the evening!
After the conference ended, many of us joined for dinner and the evening was full of inspiring talks as well.

That not being all, the day after the conference, Lennart accompanied me on my sightseeing tour through Boston. Loved it! By the way, in case you'd like to see photos from my conference travels, I've just recently started my own Instagram account. It's private as of now, yet feel free to request access.

To 2020!

The 2019 edition of the Mob Programming Conference came to an end. Yet there are already plans for next year being made! And we know one thing already. We need more moberators, meaning people who facilitate mob sessions, so we could offer more smaller ones to make the conference even more focused on hands-on practicing and learning with each other. If you have mob experience and would be up for facilitating, feel free to reach out to Woody! Or alternatively, Lennart. Or me, as it seems. Time will tell ;-)

TestBash Brighton & Automation in Testing - A Full Week of Learning

About a week ago, I returned home from a full week of learning. I got selected to speak at Test Bash Brighton 2019, the mother of all TestBashes - feeling super honored! When I learned that Richard Bradshaw and Mark Winteringham offered their three day course "Automation in Testing" just before the conference, I decided to extend my stay by these days.

Automation In Testing

The first time I heard about this topic was by listening to Richard's talk back in 2015 at Agile Testing Days. I got intrigued, and joined Richard's and Mark's related tutorial day the year afterwards. I was super curious how their content evolved. And I did not regret it at all, to the contrary!

They gave the course for the tenth time and thus labeled it their version 1.0. Also, as we started on April 1, a nice little April's fools joke was included ;-)

Now, I don't want to spoil the contents of the course. I'd rather heavily recommend that you take it.

What I really liked was that the following things were in focus:
  • Testing and us as humans involved
  • The multiple ways how automation can help your testing
  • The manifold ways existing or self-built tools can help your testing
  • How to educate people back home
  • Many different hands-on exercises, learning and practicing together, in smaller and larger groups
The people-centered focus of the course was even greater as the participants were a wonderful group of kind people, eager to learn, open to collaborate. They made the course special!

Besides the actual content, I learned a lot about myself once more during the course. We had time to solve a problem on the second day. Our table's group worked very well together before, yet we stumbled in this challenge. Speaking for myself: I found myself pressured by the task at hand, especially by the limited time and the need to justify our decisions well at the end. I found myself not being able to make the jump from our great discussions on architecture and prioritization to actual implementation. I found myself a lot less confident in implementation than I would like to be. I found myself getting paralyzed by the fact that much of what we wanted to do existed already in the project, so what's the point of implementing it again. I found myself realizing the more stressed I am, the less I understand, also acoustically, the more solo I work, the less help I seek - the less I enjoy what I am doing. I found myself getting angry with myself. This was a real grounding experience. The good thing: The next day we found ourselves in different groups, getting a different problem to solve. And we thrived together! The whole table mobbed together, getting all tasks done by bringing all our knowledge, experience, observations and any other skill in. A wonderful experience! Now, all being said: if you have the chance, try it yourself.

The only downside of taking the course was that I missed the overlapping new conference TestBash Essentials. From what I heard from very experienced people, the talks were all super high quality and very welcome reminders of the basics we might have never got taught ourselves! Hope I can catch this new format next time.


TestBash Workshops

For the workshop day I chose two that I've wanted to attend for some time now. In Angie Jones' "Clean Coding Practices for Test Automation" workshop she guided us in refactoring a "smelly" automation project, sharing her wisdom of good practices and design patterns for automation throughout. It was great, well structured, easy to follow, giving time to practice and find the solution ourselves before discussing it. I really enjoyed it!
In the afternoon I joined Mark Winteringham's workshop "Approval Testing: Superpower Your Automation Feedback". I've heard of the approval testing approach for quite some time now, yet never got my hands on it to give it a try myself. The workshop gave me exactly this opportunity, and I was positively surprised by how easy and fast it was to add valid tests. Even though you had to run them at least once to approve the first snapshot. The workshop was well instructed and easy to follow along.
During both workshops, I worked solo. Not my preferred way of working, yet paying well into my #CodeConfident challenge. A personal achievement during Mark's workshop was that I was able to do all exercises quickly and offer my help for others!

TestBash Conference Day

The big day came, and I had the honor to open the conference! In my talk "Cross-team Pair Testing: Lessons of a Testing Traveler" I shared the lessons learned on my Testing Tour. I was overwhelmed by all the positive feedback I received afterwards, both in person and on Twitter! This really added to my confidence. As this if often dearly needed, I established a habit over the last conferences. To make my own achievements visible, I started to list all the feedback I received for myself. Whenever I am having a bad day, that's something to look back into. It really helps me to acknowledge that I indeed could provide value to these people. I am also always creating a Twitter moment and add all tweets to it. I normally don't share these, yet feel free to check it out my TestBash Brighton Twitter moment to see for yourself.
The greatest thing: With my talk I could inspire many other people to go on a testing tour themselves, or start pair testing with other testers at their company. The best feedback ever!
The rest of the day, I created sketchnotes of the talks again - I found I really enjoy this style of note taking during talks. I remember a lot more from the talks, and the community really welcomes me sharing them - so thank you Marianne Duijst once more for your huge inspiration!
When it comes to Marianne, who normally creates wonderful sketchnotes herself: this time she did the amazing endeavor of live blogging the talks. Check them out to get a lot more in-depth impressions of the talks!


TestBash Open Space

Saturday came, and it was the sixth day of learning in a row. I had to admit to myself that my brain did not work well anymore. So I've spent most of the open space sessions in the hallway, in conversations with other people. That re-energized again!
The one session that stood out for me personally was the last one where I joined Jay Harris being asked all things hacking and penetration testing. Absolutely informative, learning a bunch!

Relaxing and Looking Forward

The conference was over, and there were few people left. One of them was Melissa Eaden, and we chose to go sightseeing together. We had a lovely time! If you get the chance to, speak with Mel. She is simply amazing. Extremely knowledgeable, inspiring, and simply fun to be around with.
This conference was made by the community, the people. I loved the reunion with many wonderful beings, such as João ProençaPatrick Prill, Gil ZilberfeldGem HillClaire Reckless. It was great to meet people for the first time in real life, like Parveen Khan. And it's always great to meet many new people as well, many of them on their first testing conference like Marissa or Georgia Bloyce!
I had a very great time, and am already looking forward to returning to the UK for my next TestBash - as I got selected to speak at TestBash Manchester as well! For this I will share my journey and lessons learned from my challenge of becoming #CodeConfident. This will be a brand-new presentation - so Patrick, I need you and looking forward to receiving your wonderful feedback! :-)

Friday, April 12, 2019

Calling for Diversity - Tickets for the German Testing Day

The German Testing Day 2019 will take place on June 7th in Frankfurt am Main, preceded by a pre-conference event with workshops the day before. Check out the awesome complete conference program or the one filtered for English talks.

This year I have the honor of giving the opening keynote, and by doing so I have the following conference tickets to give away:
  • two tickets including travel assistance, and
  • one ticket without travel assistance.
These tickets are intended to increase the diversity of the German Testing Day and to enable people to attend the event who would not be able to come without support. Following Cassandra H. Leung’s great example, here’s how it goes.

How to Apply

Simply let us know why you’d like to attend the German Testing Day this year but cannot come on your own. Maybe you are just starting your career in software testing. Maybe you don’t receive financial support from your employer. Whatever it is, tell us your story!

Please send an email to info[at]germantestingday.info with the subject “GTD 2019 DIVERSITY”.

We are accepting applications from today, Friday, April 12th, until 15:00 CEST on Sunday, May 5th - so go for it and send it in now!

The lucky ones will be contacted shortly after the submission deadline. We’re looking forward to reading your stories. Good luck!

Interested in the finer details? Continue to read.

Who Are We

“We” are Thomas Rinke and Lisi Hocke in particular, responsible for the selection process, and the German Testing Day organizer group in general.

What Is Included and What Not

Tickets with travel assistance. These tickets will provide entry to both the pre-conference sessions and the conference day. Furthermore you will receive up to two hotel nights in one of the conference hotels (which will be booked by the organizers). Travel costs will be reimbursed up to a maximum of 250,- Euro after providing receipts.

Ticket(s) without travel assistance. Theses tickets will provide entry to both the pre-conference sessions and the conference day. Travel and accommodation is not provided, reimbursed or covered in any way.

The tickets are not redeemable for a monetary value.

Requirements for Your Application

To apply, you must be able to attend both the pre-conference event on June 6th, 2019 and the conference day on June 7th, 2019. Besides that, all you need is an interest in testing and quality and your story why we should pick you.

In order to allow us to make the best selection, please also tell us your honest thoughts on how much you depend on the travel assistance.

If you win, you must also provide us with a means of privately sharing information on how to claim the free ticket. An email address is ideal for this.

What Happens if You Win

If you win, you will be provided with instructions how to register for the German Testing Day 2019 free of charge. You will need to provide us with some means of privately sending you this information, preferably an email address. This will only be used for the purpose of contacting you regarding the GTD diversity tickets.

Terms and Conditions & Data Privacy

If you get selected, you will be provided with instructions to register the German Testing Day 2019 free of charge. In order to complete the registration, you will have to agree to SIGS Datacom terms and conditions and data privacy statement. If you decide not to agree, or find that you are not able to attend for any reason, please let us and SIGS Datacom know as soon as possible, so another lucky person can be selected.

Wednesday, March 13, 2019

#CodeConfident: Serenity Cucumber Practice - Part 3

This is the continuation of the coding journal on my first public code challenge serenity-cucumber-practice. If you haven't done so already, it's advisable to check out the previous entries first.
Although this part reflects only one more step in this practice project, its impact was huge. Parveen Khan had scheduled a pairing session with me. I was really looking forward to it as we had a call end of last year where she had shared that she was on a similar learning journey as I was!

March 9

  • #CodeConfident live pairing session with Parveen Khan
  • shared our challenges and struggles, what we want to learn
  • demoed the existing project, what's included, how it works, how I got started
  • Parveen agreed to give it a try, she drove and I navigated her through
  • implemented a new scenario this way, sharing a product to a friend
  • could re-use the given step; the when step was easily done; regarding the then step, we could not yet find the correct locator as it hit the wrong element; here we ran out of time
  • we did all that in very small time frame
  • in retrospect, Parveen shared how scary but how great it was to do it herself, but now she understood what we do; she only wrote feature files so far, not more; asked lots of people to explain the concepts; only when she now did it hands-on, getting instructions she understood the connections; once again the magic of strong-style pairing! really really happy about the outcome; great practice for myself as navigator as well, felt quite confident in what we were doing
  • we agreed to have a second session, Parveen will practice as well and then we can tackle the next challenge together
  • TODO: fix, clean-up and commit

March 9 (cont)

  • fixed locator
  • cleaned up, adapt code to domain language
  • committed scenario


Meanwhile...

Shortly after Parveen and I had our session, the program for TestBash Germany 2019 got released. You can't imagine how delighted I was to see Parveen on that program! Originally, I had planned to skip the 2019 edition as my schedule is very tight this year and I promised myself to take care of myself. However - Parveen now really makes me buy a ticket! I simply cannot miss the chance to see her speak. She has so much to share we all can learn from! Oh, and if you cannot make TestBash Germany, she's speaking at Agile testing Days USA as well ;)

Sunday, March 3, 2019

#CodeConfident: Serenity Cucumber Practice - Part 2

If you've read the coding journal of my first #CodeConfident challenge, you know that I've called for collaboration. The great thing: people followed the call! Many thanks to those who gave feedback on my first public code challenge serenity-cucumber-practice. Here's how the story continues and the project evolved.

February 7

  • received the following code review feedback from Peter Kofler:
  • "The Java language `assert` should not be used in tests. It can be disabled (is disabled by default) and does not give a good error message. I recommend using `assertEquals(expected, actual):` I see Serenity comes with AssertJ includes. I recommend using that. Open http://thucydides.info/docs/serenity-staging/ and search for assertj."
    --> switched from Java assert to use AssertJ assertions (http://joel-costigliola.github.io/assertj/assertj-core-quick-start.html); now understood why the Java asserts did not provide me as great messages as the Groovy asserts we use at work (note to myself: should have questioned that earlier...)
    --> "Thanks a lot! I already wondered why the asserts did not provide me a decent message. Switched to AssertJ assertions now, definitely a way better option :)"
  • "You do not have to create a branch for a work in progress test. Instead mark it as pending. E.g. Cucumber's "@wip" in the feature file ignores the scenario. Here are some options https://stackoverflow.com/q/3064078/104143"
    --> added option to ignore certain features & scenarios, excluding the tag from the Cucumber test runner
    --> "Thanks! I am aware I don't have to create branches to try things out. In this special case I decided to go for a branch as I was already suspecting that my approach is flawed and won't work. I only wanted to keep the work for reference and to receive feedback on it. Still, I now added the option to ignore single features or scenarios, something I was aware of but had not included here. Thanks for the hint!"
  • "All methods in this file are too long. Maybe split out chunks of coherent logic into helper methods. E.g. line 125-132 could go into a `createProductJsonItem()` method. Also building the request should go into another method. The remaining top level method will be easier to understand."
    --> did not think of this as this was "only" playground code - and yet it still makes any code harder to read, even if it's throw-away code; so, split parts into helper methods
    --> "Good point, thanks! I've now split parts into helper methods."

February 25

  • first #CodeConfident live pairing session with João Proença
  • I showed the project status, shared the struggles with the remove item from cart scenario
    • João: let's first see what it really does; inspected the add to cart button
    • we learned we can simply use the URL call sent on adding an item to the cart ("http://automationpractice.com/index.php?controller=cart&add=1&id_product=1&token=e817bb0705dd58da8db074c69f729fd8"); learned that the token parameter is not needed, but this call only works in case you have a session first, so need to access the page in general in the same browser session first; --> we implemented this approach and it worked! :D
    • there are still problems with it, like the usage of a hardcoded product id; we are depending on its existence; João would rather use the product name or something; using a proper API to create our test data would be best
    • João is using a lot of subcutaneous testing for his product, using an API that's exactly called as the UI calls it, would increase testability here a lot
    • test data management is a really complex topic; they first tried the approach to set up the complete data before any test suite run, which turned into a big monster; now they are offering methods to create test data on demand when needed for each scenario; we use the latter approach at work, too
    • I learned what I missed when searching for a solution myself: the exploratory mindset when approaching an automation problem, I already jumped to approaches I knew
  • another problem João sees: usage of product ids in the feature files is not nice; would rather use the product name
    • João explored the URLs found in the source, could not find something suitable; "?name_product=Blouse" or "?name=Blouse" were not working
    • ideas: we could 1) maintain a sort of dictionary in the code to map id and names, 2) use any product randomly but we would loose deterministic characteristic of the test, 3) hide the product id to lower levels as we don't care which one is used (in our product we often use the third approach)
  • I shared my challenge to hover over category menus
    • João would try an implementation to hover over the element then debug the test and see what's really happening; would probably need to wait that submenu is displayed, would check that style is changed to block
    • afair the problem was finding the element to hover over; João: maybe the element did not have the hover, seems the <li> has it
  • retrospective: for João it was a really cool session, these kind of exercises always trigger interesting discussion, e.g. around test data management, that the Serenity session offers to pass over variables between steps, and more; was really productive for him; Lisi: was really cool, the biggest learning was to see João's approach how to tackled these challenges, realized I got stuck in my boxes when tackling different challenges but should rather combine all skills I have; the short coding part together was nice too, would like to see more of that in future sessions, but also had really interesting discussions, was eye-opening overall; João: I'm not coding all the time, I'm not the person for that, rather trying to figure out shortcuts like calling the URL, I saw the URL and found it interesting so I tried things there; it's really about combining the skills to the problem, it's not just coding
  • TODO: commit solution, hide product ids, try again hover scenario, add update quantity scenario
  • TODO: update blog post / create new one, including code review from Peter and session with João; ask both first whether they are okay with that!
  • TODO: select next challenge
  • reflection before session and afterwards: we did it now quite similar to Angie Jones' proposal: http://angiejones.tech/hybrid-tests-automation-pyramid/
  • realized that the needed URL was only given when inspecting the "add to cart" button on the search page, not on the product page itself!


February 25 (cont)


February 26

  • hid product ids from shopping cart scenario steps, don't care which product it is
  • TODO: try again hover scenario, add update quantity scenario
  • TODO: create blog post with code review from Peter and session with João
  • TODO: select next challenge

February 27

  • aimed to implement hover scenario
  • tests suddenly get ignored and therefore skipped! found it's related to the tags used to mark parts to be ignored; as soon as no scenario is ignored the tests run; found that ignoring single scenarios still worked, but ignoring a whole feature file will lead to the not ignored one to be skipped! updating Gradle dependencies, rebuilding project, restarting, etc. did all not solve the issue; updated Serenity libraries to latest version --> now feature level tags work again!
  • found that TightVNC can auto-scale the window, more useful for my case than TigerVNC on Windows
  • found a way to navigate to the desired category (not elegant, but it's working)
  • found that the assertion failed and yet the scenario was marked as passed! IntelliJ warned that the assertion result is indeed ignored; using a JUnit assert the assertion throws... lesson learned: sometimes it helps to walk away, take a break, then have a look again; this way I found that I set a bracket at the wrong spot so I did not really assert for something
  • cleaned up
  • TODO: add update quantity scenario
  • TODO: create blog post with code review from Peter and session with João
  • TODO: select next challenge

February 28

  • implemented update quantity scenario
  • got annoyed by rewriting camel case to snake case, so installed this plugin to switch easily: http://plugins.jetbrains.com/plugin/7160-camelcase
  • speed of implementing very first attempt heavily increased the last days when practicing more regularly :)
  • remembered how to wait for expected condition
  • remembered how to cast different data types in Java
  • remembered regex for numbers
  • realized code style inconsistency, having step definitions in snake case and all other methods in camel case; unified it in favor of camel case
  • TODO: create blog post with code review from Peter and session with João

What else, what's next?

A few more pairing sessions had been arranged already. We will decide on the challenges to tackle together when the sessions get closer. In case you'd like to become a part of my journey, feel free to schedule a session with me as well.

Although I had not planned to do so this year, Angie Jones triggered me to submit to Test.bash(); - and in the end I could not resist any longer. The topic? My code-confident challenge of course. Fingers crossed!
Besides that, my Test Automation University course "The Whole Team Approach to Continuous Testing" is finally recorded and about to go live soon - which means I have my focus back on becoming code-confident. I'm about to choose my second code challenge these days, so stay tuned for more!

Thursday, February 21, 2019

European Testing Conference 2019 - Designed for Us

Last year I got selected to speak at European Testing Conference together with my learning partner, Toyer Mamoojee. It was such an inspiring experience that I knew I had to come again in 2019. And yet again it was amazing!
For this edition I was joining the conference as participant - nothing to do for me than learning together with great people of many different roles and perspectives, all interested in testing. After speaking at many conferences this was a really relaxed experience that I really enjoyed for a change.
Here are the sessions I attended, including my sketchnotes.
As always, I tried to get the most out of the event, not only attending all session slots (I felt I also had the energy to do so), but also making good use of the breaks to talk with people old and new, and of course using the time after the official program was over. After experiencing a lot of conferences during the last few years (a lot more than I ever imagined, thanks to my speaking challenge of 2017), I learned that the unofficial socializing part of a conference is usually the most valuable time spent. Attending sessions is great and a good learning experience, and yet exchanging knowledge and new things learned with my peers is unbeatable.

The great thing about European Testing Conference is that they design the conference so that plenty of these kind of informal learning opportunities and networking chances are available, the space for that is created by intention. You only have to seize the moment! To get further impressions about this very special atmosphere, check out the following links.
One conference was over, and the next one started! I felt really honored and lucky to get the opportunity to attend #ET19 just the day after European Testing Conference. This was my very first peer conference, and also one about a topic very dear to my heart: exploratory testing. For now, I can only say so much: it was great, and it was a lot to take in! I still have to process everything. In the meantime, check out Marianne Duijst's awesome #ET19 sketchnotes.
Last but not least, here are some of my favorite #ETCmoments of 2019! I'm already looking forward to the 2020 edition of European Testing Conference!