I’ve recently started working on a personal project and one of my goals for this project is to learn how to use Release Management in TFS/VSTS to deploy to an Azure VM. As a QA Test Engineer, naturally, I wanted my project to have automated tests built in. I started creating my project by setting up the project repository in VSO and creating my build. I wrote my first bit of code and associated unit tests. I then committed and pushed my code, expecting everything to go fine because it worked on my local dev environment. I spent several frustrating hours afterward trying to figure out why it didn’t work. I want to share the solution in hopes that I can save some hair pulling and head scratching for anyone else trying to accomplish what should be a fairly simple task.

My first mistake was assuming that using Chrome to run my tests would also work in VSO. It doesn’t work, and for reasons that should have been obvious. If you look at the installed software for the VSO Hosted Agents here, Chrome is not in the list. No surprise! I should have known that from the start. I knew that I could install PhantomJS locally in my project using npm so I went about doing that.

I’m also using gulp and karma to run my unit tests so I added the necessary bits to get the tests running using PhantomJS:

And in the karma config:

I ran the tests locally and everything looked fine so I pushed again, fully expecting the build to pass this time. It failed again. Here is a log snippet from that failed attempt:

Wait…what? The tests just ran fine on my local machine. Why couldn’t it capture the browser? Honestly, I have no idea why this doesn’t just work right out of the box. I couldn’t find any good explanation but I do know how to fix it. I spent several hours and multiple failed builds trying to get it to work before I finally figured it out. The hardest part was that there really isn’t a ton of information online about how to do this so it took a lot of digging around to find the solution.

The first thing you have to do is add a PHANTOMJS_BIN variable to your build definition in VSO and point it at C:\NPM\Modules\PhantomJS.cmd. This worked to get my tests running but then I ran into another problem. The tests executed and passed just fine. However, the build agent stalled on the test build step and I eventually had to cancel the build.


Ok, now what? This doesn’t happen locally so there is no way to debug it to see what’s wrong. Thankfully, the solution is pretty simple. You just have to tell the gulp task to exit the process when it’s done. I updated the gulp task, pushed, and the build FINALLY succeeded. Here’s how I changed the gulp task to get it working:

Honestly, I spent several hours searching for a solution. I even started down the path of configuring TFS Express in a VM to use as an on-prem build controller. After reading the prerequisites for that task, I decided that I really didn’t have the patience to install all the software needed for that. The solution is actually very simple but oddly there isn’t much information out there on how to do it. A few people mentioned that changing the agent from Hosted to Hosted VS2017 seemed to do the trick for them but the results were the same for me regardless of the agent I used. The agent always stalled on the test step.

One other thing to mention is that I noticed a lot of recent posts stating that something had changed recently with the hosted agents, and test tasks that used to work were now failing or stalling. This made me think about what would happen if, for some reason, Microsoft ever decides to remove PhantomJS from the hosted agents. I figured that my builds would start failing again so, just for kicks, I changed PHANTOMJS_BIN to point to my project’s local copy of phantomjs to see what would happen. It worked!

It appears that you can use either C:\NPM\Modules\PhantomJS.cmd or $(Build.SourcesDirectory)\<MyProject>\node_modules\.bin\phantomjs.cmd. I’m inclined to use the latter since it means I depend less on software that Microsoft installs, updates, or removes from the hosted agents.

So just to recap, the solution has three steps:

  • Setup your karma config to use PhantomJS as the browser.
  • Setup your gulp task to exit the process when it’s done.
  • Add the PHANTOMJS_BIN build variable and point it at phantomjs.cmd.




AppRiver Ignite Talks March 2017 Monopoly – The Agile Edition

AppRiver Ignite Talks March 2017 Monopoly – The Agile Edition

This talk was based on a planning prioritization technique I learned about while taking a project management course called “Agile Product Owner: Techniques”, by Angela Wick. This course can be viewed on Lynda.com. The process has been called “Buy A Feature” or “The Budget Game” prioritization.

The goal of this planning technique is to have the stakeholders of an application use money to decide what they consider valuable. The advantage of seeing what features the stakeholders see as most important is indispensable. The catch? Only enough money to pay for 40 – 70 percent of the costs of all the features and stories is distributed. This gets the participants talking, debating, doing mergers and acquisitions, and working to get their feature purchased.



Lynda.com Project Management Course


In the Global markets, the ability to present your application in the users native language is crucial to its success. Angular Translate provides a simple API that can be used to build multilingual AngularJS applications quickly. In this demo, I will create a single page with two languages.

Wire Up

Before you begin, you will need the latest stable versions of angular.js and angular-translate.js in your scripts.  Then, you may declare angular-translate as a module load dependency.

From here, setup a config function for your module and inject $translateProvider.  If you do this, it will create the translation table at configuration. This allows the angular-translate to access the components as soon as they are instantiated. The $translateProvider tells your app which language to use and shows the app the language tables.

Once angular-translate is wired up, you need to build the translation tables inside the configuration phase and specify the default language.  Any language, which you plan to support, needs a translation table.  The table consists of json key value pairs.  The key is the id and the value is the string value of your translated text.  The function preferredLanguage() specifies the default table if no matching language is specified.

Changing the Language

Changing the language at runtime is also very easy.  In your controller, inject the $translate service and set the function, $translate.use(), to the value that you would like to use.  Of course there are many other ways to decide the default language besides clicking a button.  You may want to base it off the browser culture or possibly a user cookie.  But for simplicity, we will manually set it.

In this example, we have two buttons.  One button is for for English and the other button is for Spanish. Each include click events that call the changeLanguage() function.  When the function is called, the language key is set to the hardcoded value.

Tagging Text for Translation

Tagging the text for translation can be done with the angular-translate filter, directive or service in the controller. As you can see in the above example, there is an attribute in each button called translate.  That is the angular-translate directive.  It will render as the translated text inside the tags.

Tagging text with the filter can be done by entering the translation key inside the double curly brackets with the translate filter. Angular-translate will know to render the correct value at runtime.

When using the service to translate text, you need to inject $translate in the same way we did when changing the language.  You may then call the service and pass the translation id.  The service is based on promises. If you are not familiar with them, this article may be helpful.


Angular-translate also allows multiple keys to be passed in a single promise.



One issue you may notice is a console error about sanitation. You will need to definitely address this issue.

Console Error

Your site may be vulnerable to attacks unless you set up a sanitation strategy.  It is possible for output to not escape properly, which allows hackers to attack your site.  View the site below for more information on sanitation strategies.



There are many beneficial extensions for angular-translate that will allow for asynchronous loading and lazy loading. For more information on asynchronous/lazy loading, view the below link:


Additional Resources

As you can see, angular-translate gives developers a fast, easy way to setup translated text for your website or application.  But this was just the tip of the iceberg, check out their guide and API for a full list of features.


Get The Job That You Want!

Trying to find a job fresh out of college is hard, and I hope my recent experience will help you find the job that you want. I see some graduates snatch up the first job offer that they receive while other graduates are not able to find a job that they want, so they settle for a job that they really do not want. I graduated from college over a year ago and a few of my friends see how happy I am with my job. They often ask me, “How were you able to find such a good job with your background.” When they mention my background, they are referring to the fact that I graduated from a small college with no work experience. I believe that there are three steps to attain your dream job:

  • Enjoy what you are doing
  • Be passionate about it
  • Practice what you care about

Enjoy What You Are Doing

The first and most obvious step to obtaining the dream job is to enjoy what you are doing. You will be working 40-hour weeks for the next 30 plus years of your life, so make sure that you like it. To be more specific with my career path in software development, what will excite you? Video game development, Web site development, mobile development, etc. There are many things to think about when pursuing a career in software development. What languages do you want to use C#, Java, C++? When I graduated from college, I had no idea what I wanted to do with my Computer Science degree besides programming. After a month of submitting applications to almost every associate/junior-level position, I finally received my first offer. I was so excited to receive a callback, but then after discussing what I would really be doing with this company I decided to turn it down. In the beginning, I would receive six months of training with them and then start working as a tester. The position was also with a huge corporation, so I feel I would have been treated like an assembly worker on a line doing the same thing every day. After this offer, I decided to only apply to small businesses that used C#, which was the first language I was taught in high school and was my personal favorite.

Be Passionate About It

The more passion you have about something, the easier it is to get excited and do it well. Passion is something that your employers want to see from you. Passion shows your eagerness to continue learning and expand your horizons. Technology is evolving fast with new languages and practices are constantly coming out. It is great if you have the willingness to continue updating your skill set. I knew I loved programming after writing my first Hello World program in high school. It’s amazing how fast you can go from nothing to a fully completed application. I love what programming/code can create.

Practice What You Care About

There are thousands of other software developers that are competing and applying to the same positions that you are. If you want to stand out, you must express your ability to learn while sharpening your skills and practice your skill set with a passion. If you are not passionate about what you are doing, you will not put in the effort to become a better developer. As I mentioned earlier, I graduated from a small college with no work experience. Due to this, I received many rejection letters from almost every company I applied. They would say, “You seem very smart, but we are looking for someone with a little more work experience.” This was annoying to hear. How could I get work experience if no one would give me a chance! After several months with no offers, I decided it was time to put down the video games and start showing that I cared. I started watching several tutorial videos on different topics:

  • .Net
  • MVC
  • AngularJs
  • SignalR

My brother was also trying to break into the computer science field and he was fiddling around with a gaming engine called Unity3D, which luckily used C#. My brother and I decided to develop an app for the iPhone. It took about a month to develop the app, but I learned a lot about the development life cycle and testing locally and in production.  Looking back now, these two areas were my weakest areas when interviewing for potential jobs since I had never dealt with the development process. With the app on the store and many hours of tutorial knowledge in my head, I went to two more job interviews. With this valuable experience, I was able to carry on discussions more naturally since I had more of an idea what I was talking about. I feel the companies, which interviewed me now, were able to see that I was a passionate worker. From those two interviews, I was offered three different jobs.

Getting a job that you are going to enjoy is very important. Make sure that you show the employers/interviewers this passion and love with projects and applications that you have developed and are continuing to improve. This article does not apply to just software developers, but anyone pursuing their passion. If you enjoy it, have passion and take the time to become the best at it. If you do this, you will get the job that you want!

When I was a little kid, I would occasionally get hiccups that rocked my diaphragm so badly my shoulders ached.  Grandma called during one of these uncomfortable bouts. I answered the phone with an embarrassingly audible gasp. I heard her smile through the phone as she spoke with her soothing southern accent, “You know what will get rid of those? A tablespoon of sugar under the tongue will fix you right up.” Scooping straight from the sugar canister was a rebellious act and against the rules in our house, but with her encouragement I decided to risk it.  I tried the purported antidote and she was absolutely right.

How do you remedy uncertainty about whether or not you found a bug?   When I find a bug, I need to be really sure that I actually found an issue or potential problem so there is no doubt in the minds of the reader of the bug report.  I need to clearly, concisely, and convincingly communicate to the developer and product management teammates why I think there is a problem so they want to fix it right away!  One technique that I use to determine if I found a bug is an internalized list of test oracles described in Michael Bolton’s article, Testing without a Map [PDF].   I use this list, originally created by James Bach, to examine general consistency heuristics:

  • History – Is this version of the system consistent with prior versions?
  • Image – Is this consistent with an image our organization wants to project, with our brand, or with our reputation?
  • Comparable Products – Is the system consistent with systems that are in some way comparable? This includes products in the same product line, competitive products, services; or products not in the same category, but process the same data; or alternative processes or algorithms.
  • Claims – Is the system consistent with things important people say about it in writing (help documentation and marketing materials) or in conversation (hallway and coffee mess chatter).
  • Users’ Desires – Is the system consistent with ideas about what reasonable users want? 
  • Product – Are elements of the system (or product) consistent with comparable elements in the same system?
  • Purpose – Is the system consistent with explicit and implicit uses to which people might put it?
  • Statutes – Is the system consistent with laws or regulations relevant to the product or its use?

I use this list to help me figure out if there is a fly in the sugar bowl, so to speak. If I cannot relate the issue to one or more of these consistency heuristics, then I can put the issue to rest, and not waste anyone’s time.  On the flip side, I am usually very effective in getting bug changes made since I can explain why the bug matters using one or more of these oracles. As Bolton explains in Oracles [PDF], multiple oracle heuristics may apply and some of these may contradict one another:  A product owner’s decision on what to do about the problem can be influenced by which oracles are applied.  Since our role as testers is to provide credible information, we may choose to use different oracles to temper our test framing or bug advocacy.

Test findings can trigger the following emotions: fear, anxiety, excitement, joy or euphoria.  These same emotions can cause hiccups too. [Ref]. 🙂 Over time with practice, this list can serve as a useful tool to double-check your logic and grow your skills and confidence in the art and science of bug advocacy.

Further reading:
Michael Bolton’s extension of the HICCUPPS oracle list in his blog post,  FEW HICCUPPS.
For more info on how to report bugs, see Cem Kaner’s Bug Advocacy: How to Win Friends, and SToMP BUGs [PDF].