Tuesday, October 30, 2012

Test data for BDD

My team has been running into issues with our functional tests.  Two things seem to be at the core of it:
  1. Running a single test takes enough time to disrupt the flow
  2. Setting up test data for them has been painful
Out of these the second has been the major concern.  We've got some ideas for speeding up the running of the tests, but haven't started using them throughout the team (like using grails interactive mode).

For test data the team has decided to go with a static database.  I have some concerns with this approach because I'm used to building up the test data and I've had issues with sharing test data leading to pollution between the tests.

An advantage we have with our application is that a majority of the data stored in it is generated during normal processing.  So, in theory, once we've got a set of data we can work with it in isolation.

A disadvantage, is that it takes a bit before we've generated all of the data for the full set.  So we can't quickly generate our data.  The real issue here is when we update our data model.  In general we've been willing to wait the days that it might take for all accounts to be updated.  Running tests against a static database means that we'd need to be able to generate the test data for it or wait for the released code to process it and copy it over to the static system.

Though maybe we could cut a path in between the static and live by limiting how much data we pull in and only working on the subset.  This means we'd generate the data each time before running tests against it and expect to reset it for the next time or at least refresh it.

I'm still leery of not exploring edge cases, but maybe that's not the place for functional tests.  Should we just let them thread through things to make sure everything is communicating, but rely on integration and unit tests to explore all of the variations and make sure they are covered?  Seems plausible - though I think I should do more reading on BDD and the various disciplines around that.

Monday, October 22, 2012

First iteration under XP

Unfortunately, I went on vacation the last day of the iteration, missing the demo and retrospective.  From my perspective we stubbed our toes a bit.

We focused on our most recent app that had been developed using BDD.  It was the teams first shot at it, so there were definitely rough edges to our practice of it.

We're struggling a little with defining what our tester should be doing.  Our current focus is helping with developing acceptance tests and doing some exploratory testing.  This felt awkward during the first week because our tester didn't have access to our git repository and was sick/working from home at the beginning of the sprint.  So we didn't communicate or share the acceptance tests we had already developed.  I hope getting access to the git repo will help some of this.  Regardless, we need to take time to discuss them.

Another painful spot was a story that ended up bring much larger than expected.  What made this painful was we recognized that there was more work and discussed it as developers, but neglected to create a task to expose it.  So when we ran into some trouble we ended up splitting the story at the last minute.

Finally, we had some difficulties working through the automation of our acceptance tests.  Between learning how to write the tests and learning the tools (cucumber and geb) we stumbled a couple times.

While I enjoyed Florida, I was a little sad to not be with the team as they start the second week of this.

Sunday, October 7, 2012

Transitioning to XP


My team at work is in the process of reading The Art of Agile Development by James Shore and Shane Warden.  I gather initially it was brought to the team as a way to learn how to improve our writing of stories. We've decided to go further with it and try to rethink our development process.

We have seven developers that maintain several applications, with generally two or three of them getting focused attention (more than just fixing bugs) at any given time. These apps vary greatly in how much automated testing had been done for them and how much technical debt they've pulled up.

Our first step/attempt is going to involve one person trying to do any necessary maintenance work for all but one of the apps. Everyone else will be doing a release on the remaining one.

Some concerns we've got:
  • How quickly can we minimize the maintenance role? Cause it's no fun being the only one on the outside.
  • We don't have a coach. The book seems good, but experience is better.
  • We've still got a bunch to learn/internalize.  From TDD to visible charts to retrospectives.  While it makes sense it's not second nature so we'll have to be mindful - not the worst thing to have to be. :)
  • We can't just focus on one app and switching between them will be necessary to continue to deliver value for each of them.
  • We've got a customer identified for our first product, but the other apps aren't as clear cut for who could serve that role.
I'm certain will have more concerns and challenges as we go along, but hopefully we'll keep moving forward.

Tuesday, February 7, 2012

Another day of games

I took the drive down Woburn, MA for Unity Games 18, to get another day of games in.  This time a couple friends went down with me.  We played through a number of games that I wanted to try out as well as some extra ones.  Here's my take on the games we played:

Kingdom Builder - This game has very simple, deceptive (at least for me) mechanics.  The part that kept tripping me up was that when placing new pieces they had to be next to your currently played pieces if that was possible - otherwise you could place them anywhere.  My brain had a hard time keeping track of this when switching terrain.  To be sure the rules were clear - it was just my brain fog.  We all felt this was a solid game and it is definitely going on my wish list.

Discworld Ankh-Morpork - Based on the Discworld books by Terry Pratchett - one of the guys I went with knows the books and was curious, so we gave it a whirl.  Each player takes a character that has a different victory goal (though all the goals aren't unique) and you go about trying to make that happen.  The trick is that the goals are kept secret so while you're going for yours you need to try keeping other goals from coming about.  Easy game to learn that was enjoyable, but not one that I'm wanting to own.  (Though the guy who knows the books liked it so it might still end up at game nights, which I won't complain about. :))

Eminent Domain - A deck building game that was very enjoyable.  It had a completely different feel from Dominion, other than building up a deck of cards.  The theme was nice in that you were exploring planets (that stay in the place in front of you) and colonizing or using military to conquer them.  You deck consists of role cards, that are more effective the more you have at a time, and technology improvements that you get through the Research role (which can help with Roles as well).  This was a very enjoyable and definitely one on my wish list.

Santiago de Cuba - Initially I was thrown off by the randomness of how the board was setup, but after thinking about it for a bit I realized the changing of the Cubans and the Buildings makes for interesting combinations that need to be accounted for in each game.  The main play has you driving a car around to stop in front of the shop for a Cuban or the port to load up the ship with goods.  However, you can move the car extra (for some money) to get what you want, or (maybe more importantly) to go past something someone else really wants.  Another for the wish list!

Wiz-War - This game got a big-ole thumbs down from all of us.  The build quality was nice, but the rules were annoyingly complex for a game that was essentially all about beating up the other players and/or stealing their treasure.  It would be good for slap stick game if it wasn't so painful to start up.  Apparently, it's a remake of a game that was notorious for bad rules.  For my money I'd rather play Dungeon Twister - though I haven't played that with the 3/4 player expansion.

Princes of Florence - The first thing that struck me about this game was the font used for things, which really threw me off at first. For some reason I found it distracting, even though I felt it was appropriate for the theme. Once I got past that, however, I was able to enjoy this auction game - though in this play I initial severely misjudged what my friends wanted while I was trying to up the bid only to increase what they paid for things. I enjoyed the balance of things and would definitely pick up this classic.

Africa - I consider myself a fan of Reiner Knizia's game designs, but this one left me pretty board. You have some limited options available and for the most part you felt you were at the mercy of the tiles you flipped up. There were ways to work with what you got, but it felt too luck heavy and didn't make any of us really want to play it again.

Medici - Another, more respected, Knizia game with an auctioning mechanic. This revolves around the very simple mechanic of players taking turns proposing a set of 1 - 3 items to be shipped of different values. Players get one chance to bid on each set and if they win they spend money and put them in the 5 spaces on their ship. More money is acquired by having the 1st and 2nd most point totals on their ship or the most items shipped per good. So you're constantly balancing how much it is worth to go for any given offer. I'd love to play this and while not at the top of my wish list, I still hope to get it. I'd also like to play it with more people.

I was going to try out Troyes, but I saw it in their silent auction along with Masters of Venice and since the money goes to charity I figured what the heck and bid it up.  Not that I knew anything about the second game, but now I'm looking forward to pulling them out at a future game night.

Glad I was able to make it down for another Unity Games and hopefully I'll be able to snatch up the games I tried out sooner than later. :)

Thursday, December 1, 2011

Null values injected when mixing Grails and Spring-batch

Mild annoyance that I haven't found the root cause for, but I'm finding that not all mistakes I make in wiring up a job (like missing tag closings or pointing to a bean that doesn't exist) showing up as errors when running tests. Instead it just injects null values and leaves me scratching my head. I assume this is because I'm using grails and not just straight spring, but again I'm still looking for the root cause.

Friday, January 28, 2011

Grails switching to and from inline plugin usage

We had developed some local plugins that would be installed in our main app when it was deployed. However, during development it was very convient to have them inline. Unfortunately, trying to switch back to inline usage we kept seeing a message indicating that it wanted to upgrade the plugin. Saying yes would cause it to delete the local folder and download the deployed version.

We were using a settings.groovy file in our ~/.grails that indicated the location for inline usage with "grails.plugin.location.pluginname". However, since we deployed the plugin with a name like 'plugin-name' it seems the two didn't match up. By using "grails.plugin.location.'plugin-name'" instead it worked like a champ.

Hrm...wonder if some validation could be added to help out with that - though I guess most people would just be consistent with the names...*sigh*

Saturday, October 16, 2010

October 2 - Endurace Aventure Race

This is a recap of the adventure race put on by Endurance Aventure on October 2nd, 2010.

Adrienne and I made the drive up to Saint-Donat, QC starting about 3:30 on Friday night so we could make it up for registration which closed at 9 pm. We weren't nearly as organized for this race as we were for the Bitter Pill, since each of us were coming off busy work weeks. Thanks to Adrienne for taking a little extra time off on Friday we had everything we needed even if we hadn't organized our packs.
After the race check in we got together with the other team that I knew up there from Dealer.com and went out for a couple drinks. After that both of us were exhausted and we needed to get some Zs.

Here's an overview of the course that I put together.

In the morning we had to get to the place we registered by 8 am with a couple of detours on the way to drop off our bikes and our pfds and paddles. When we got to the registration place again we got our maps and had about 1/2 hour to look them over. Then we got to listen to about 30 minutes of French, followed by about 10 minutes of quick English instructions. There was only one part that was confusing to me, but I thought I got it. I'll admit I was disappointed since I was hoping for some nav challenges, but other than a 200 meter trek off trail (which they apologized for and as it turned out a trail was available) it was all on trail. As we'll see, though it might have been for the best that they didn't have any serious nav challenges (though I'd like to think it would've woken me up...).

When everyone was ready they load us into a couple buses and drove us to downtown Saint-Donat. We had a bit of time to wait and the temperature was a little on the chilly side, but at 9:30 we were given the green light and everyone started moving. We had about a 1/2 mile jog to where our bikes were. We quickly got on our bikes and got on the trail. Unfortunately, Adrienne's bike was again not quite tuned up. After running into a couple issues we switched so I could check it out (not that I could do much for it, but I also was determined for her to not have two crappy mountain biking experiences in a row :) ). As it turns out the front derailleur wouldn't allow it into third and the rear one had trouble going from fifth to fourth. On top of that the tires created so much drag that the bike was horrible going up hills and through sand. Fun.

The bike to TR2 was on an easy trail, unfortunately during this trip we realized that we had no idea what the scale of the map was. (Afterwards we learned - though I think it was relearned in my case - that there are two standard scales and the maps we were using were 1:50.) Additionally, the area that I didn't understand from the directions got us. They told us Chemine Wall would be going down hill in the opposite direction and we'd see a blue trail marker for the cycling trail. For some reason I took opposite to mean it would be on the other side of a four way intersection. So when we came to a three way intersection with the road to the right kindof doubling back and going down hill it didn't make me think we were there. It didn't help that of the two teams we saw at that intersection one went each way. We discovered our mistake when we saw a sign for for Route 329 back 1.8 km the way we came.

The biking took us a lot longer than I would've liked, but neither of us are especially strong at that. Regardless around 11:30 we were making our way into the woods for what looked like a quick three checkpoints. Sadly my brain had turned off. Every intersection I was guessing where we were and forgetting to confirm what was around us and what the terrain looked like. Part of that was due to us not knowing the scale, but a lot of it was me just not looking around and confirm where a freekin' lake was. Or where a hill should be. Heck, even what direction we're going (though I did do a little of that towards the end). Needless to say this did not make for an enjoyable hike in the woods. We ran into a team a couple times that was making similar mistakes, but at least one of them was able to piece things together and get us back on the right track. We got all three checkpoints and made it back out without any more issues.

We came off the mountain just before 2 pm and not in a great state of mind. I was severaly disappointed with myself for messing up the navigation so much. After discussing our options we decided that we'd just assume not do the technical mountain biking, but just get on with the kayaking. So we stayed on the road around to the TR3. (After the race we heard that a number of teams had trouble with CP4. So given my navigation issues it made me even happy that we made that choice.)

So we dropped our bikes off at TR3 and made the short walk to the kayaks. I'll confess - Adrienne was hoping for a jog, but my right knee was bugging me almost all day and I wasn't up for it. We dropped our packs, put on our PFDs, and grabbed paddles and an inflatable kayak. Nice thing about these kayaks - easy to carry. Not so nice thing - they can deflate. (After the race a team told us there's was losing air on one side and by the end of the paddle they had to lean to the right to stay afloat.) The paddle was a nice change and we didn't have any issues with it other than a cloud blocking the sun from us for most of the time.

crossing rope bridgeWe left our kayaks, paddles, and PDFs, snagged up our packs and made our way back up to where we left the bikes. From there we had to go up the ski slope which wasn't too bad - though I was certainly not charging up it. At CP9 they a two rope bridges setup across the slope. We each went across which wasn't too difficult (as long as I wasn't trying to catch up to Adrienne). My arms were sore for the next couple days, but I only noticed it when I held them above my head.

Then we made it to the top - found the final checkpoint, took a couple pictures David at the topAdrienne at the top, and traipsed back down the hill. Even found enough energy at the end to run to the finish - it helps that they have the podium with the loud speaker and I was able to understand enough French to know they were talking about us.

Somehow we ended up 23 out of 33 and 2 in our division of 6. The scenary was nice and that does seem to be there focus, but I was disappointed by the lack of a technical navigation section. So in the end, while we had a good time and met with a challenge I don't think I'll make the trip back up for more of their races.