I'm currently exploring different integrations that can be done between Google App Script and Git. This is part of a bigger attempt to integrate Git data into my project management system. I'll post more on that later. GitHub supports a number of very nice sub-systems. One of them is the GitHub Issues ticket tracking system. It's fairly robust and comes with GitHub - which means it's highly integrated out-of-the-box. Integration with Google's App Script is done via the fetchURL command and JSON object manipulation. After a good bit of experimentation, I've settled on querying GitHub Issues with an "on open spreadsheet event" to avoid issues with Google's quota system. Essentially, Google prevents you from calling the fetchURL command more than X times (see the quota limits ) per day. That's not great if you have people actively working and changing data in a spreadsheet. Some of my other App Script routines are running thousands of times per d...
If you've been following along on my Excel VBA App Script journey (Part 1, Part 2), I'm converting my old Excel VBA scripts to Google App Scripts. I'm specifically focused on Excel to Sheets at the moment but the general process applies to other App Script development.
As I mentioned last time, once I figured out that you cannot use the integrated debugger without a wrapper routine, the next logical exercise was adding unit tests. The test wrapper is essentially ready to go as a unit test, it's just a question of how to formalize it a bit.
At it's most basic, we could convert the test wrapper to return a pass/fail result and be done with it, ala:
function test_myFx()
{
Logger.log("Test")
return myFx("U01",SpreadsheetApp.getActiveSheet().getRange(2,2).getValues())
}
function myFx(findStr, findRange)
{
//Do some work
}
converts to:
function test_myFx()
{
Logger.log("Test")
if (myFx("U01",SpreadsheetApp.getActiveSheet().getRange(2,2).getValues())=="U01") {return "PASS";}
else {return "FAIL"}
}
function myFx(findStr, findRange)
{
//Do some work
}
and then just call the function from your spreadsheet to determine if everything is working. The way I've implemented this is highly dependent on the spreadsheet. I originally implemented it this way so I could mimic the Spreadsheet input but for unit testing, it's better to convert to a fixed input rather than relying on SpreadsheetApp. The code then moves to:
function test_myFx()
{
Logger.log("Test")
var arr = ["U01", "U02", "U03"];
if (myFx("U01",arr)=="U01") {return "PASS";}
else {return "FAIL"}
}
function myFx(findStr, findRange)
{
//Do some work
}
A more formalized system would use a framework. One that's highly recommended is QUnitGS2. They have an excellent tutorial here. This can be boiled down to:
- Add QUnitGS2 library to your App Script as a library
- Create a test script (Test.gs) that's distinct from your code (Code.gs)
- Instantiate the unit test frame work and connect it to your code
- Publish the system as web app (accessible only to you)
- Execute the published web app and view the results
I won't repeat the detail from the tutorial. It's extremely easy to follow and has a lot of screen caps to help. I didn't find any additional detailed needed to implement the framework.
In the end, the QUnitGS2 framework brings the functionality of standardized unit tests to Google App Script development and helps with keeping large libraries function and error free.
Happy bug free deployment!
Comments