kpov_judge is a system for the automated testing of learning tasks related to networking. To solve each task, a student must create a number of virtual machines, connect them to a network and set them up according to the task instructions. Each task is defined by a file called task.py. This file contains some short instructions, a description of all the computers and networks needed to complete the task, the functions for customizing the task to each student and testing their solution. Each task for each student is customized by choosing some parameters randomly. These parameters are also described in task.py. Some of the parameters may be chosen or altered by the student. Also, some parameters might be hidden from the student. The parameters which should be chosen by the system are set in a function called gen_params(). To make the writing of this function easier, a number of helper functions are available in kpov_random_helpers. Two functions are used to test a student's solution. The first of these functions, task(...), is run on on a virtual machine under the control of the student; the other, task_check(results, params), on a remote server which is controlled by the teachers. The function task(...) performs the testing of the student's solution. It returns a dictionary of strings called results. These results are sent to the teacher's server. The function task_check(results, params) verifies that the student has indeed solved the specified task. The correct results returned by task(...) should be more difficult to create manually than it is to solve the task. Some tasks also include a set of detailed step-by-step instructions on how to perform the task. These instructions are in the form of a single web page and usually include screen-shots.