Backend Developer Tests
These are my answers / implementations of the backend development tests over at StackPath
Unit Testing
I updated the implementation at unit-testing/pkg/fizzbuzz.go to account for negative inputs
passed into each of the input arguments. In this case negatives are still treated as valid steps
to print Fizz or Buzz since the remainder would still be 0.
I have added tests in the unit-testing/pkg/fizzbuzz_test.go file to have coverage over these
inputs and many more. Running go test -v -cover ./... in the unit-testing directory will produce
successful results.
Optional improvements could be to have more of a table based testing structure similar to a
parameterized test in Java.
Web Services
The code in the rest-service directory creates a web service with the following responses:
- Respond with JSON output
- Respond to
GET /people with a 200 OK response containing all people in the
system
- Respond to
GET /people/:id with a 200 OK response containing the requested
person or a 404 Not Found response if the :id doesn't exist
- Respond to
GET /people?first_name=:first_name&last_name=:last_name with a
200 OK response containing the people with that first and last name or an
empty array if no people were found
- Respond to
GET /people?phone_number=:phone_number with a 200 OK response
containing the people with that phone number or an empty array if no people
were found
The REST service has been implemeted with the go std lib.
I have included a Makefile so I can run make test to run commands to perform manual
testing to get the desired responses above and some other edge cases. In order to have the
tests run successfully the server should be started by running go run main.go from the
rest-service directory.
An assumption I made was that if query params are passed outside of the ones listed above
the response will produce no results. In this case we are not exposing any extra unintended
behavior when a client tries to query by params not listed in the spec.
The input-processing directory has an implementation that takes STDIN as a named pipe
and outputs every line that contains the word "error" to STDOUT.
The file has two implementations by running go run main.go for a quick and dirty approach
or a go run main.go -e for a more efficient implementation. The second approach works
better for large streams without \n characters and doesn't put everything into memory.
It performs very well for these situations but for a file with many new lines that is very
large the runtime can suffer.
The program also contains a pprof profiler for cpu and memory utilization that I used for
trying to optimize the runtime of the program. I included a Makefile with a few recipies
for building the application from a Dockerfile and creating an input file of 5GB. I used
the containerized version of the application to test out implementations with memory restrictions
to verify the performance of the application.
I also have some simple tests that I ran with the test.sh script and the input_files directory
to be able to make sure when I made changes to the source code that I was not breaking functionality.