Recently, I was writing some unit tests for a data transformation application I had been developing. I had a sample file of pre-transformed data and decided I wanted my unit tests to just test a few, randomly selected records from the file. My tests would pull in the data file as a list and would iterate through a list of randomly determined indices and test the transformation of each data row. Something like this:
val randomRows = Seq(1, 2, 3, 4, 5)
for (i <-0 to randomRows.length-1) {
val randomRow = randomRows(i)
val dataToTest = dataList(randomRow)
// transform the data; assert the results
}
But, instead of “1, 2, 3, 4, 5”, I wanted random indices like “432, 260, 397, 175, 98.” How could I quickly achieve this and get different sets of random numbers for the different unit tests I was writing?
Random.org is certainly a good option for picking random numbers. Suppose I had 10 unit tests to write, each needing to test 5 random rows of data. I could generate 50 random numbers like so:
108 62 221 275 342
303 475 234 283 343
184 42 454 102 423
48 348 289 37 493
258 471 461 212 278
175 56 224 405 354
374 124 328 17 171
416 266 415 436 414
93 155 140 382 235
83 382 449 302 170
That’s great, but, annoyingly, I still have to edit these numbers and type commas in between each when I paste them into my code. Is there a way to generate the random numbers I need and automatically format them with commas so that I can easily paste them into my unit test code? PowerShell can do that!
The Get-Random cmdlet
PowerShell has a fantastic cmdlet called Get-Random that allows you easy access to Microsoft’s random number generator features. To use Get-Random to randomly select 5 indices to use in one of my unit tests, I can execute this command at a PowerShell prompt:
0..500 | Get-Random -Count 5
Here, I’m piping a list of numbers–from 0 to 500–to Get-Random and telling the cmdlet to randomly select 5 of them. The result is this:
The problem is that I’m still no better off that with Random.org: I still must manually comma-delimit these numbers so that they can fit into my code.
Formatting my random numbers
Fortunately, PowerShell includes a handy join operator to make joining my list of random numbers a breeze. All I need to do is surround my original PowerShell command with parentheses and apply a join operation to that result set:
(0..500 | Get-Random -Count 5) -join ", "
And the result:
Easy-peasy! I can now drag my mouse over that result, right-click on it to copy the formatted numbers to my clipboard, and then paste the results into my unit test.
But wait, there’s more
That mouse highlighting and right-clicking still seems like a bit of work. Is there anything else I can do to shorten my steps further? Absolutely! PowerShell has another great cmdlet called Set-Clipboard allowing you push PowerShell results right into your clipboard. So, I can just pipe my formatted, random numbers right into the Windows clipboard:
(0..500 | Get-Random -Count 5) -join ", " | Set-Clipboard
Now, once I run the PowerShell command, I can just hop right into my code editor, position my cursor at the appropriate position, and paste in my random numbers. Quite a convenient little command!
Recent Comments