SciPy
SciPy (website) is a popular tool set that includes NumPy, Pandas, and SymPy. SciKit Learn (website) is also supported. For evaluating exercises written using SciPy we're using the NumPy testing and unittest frameworks.

Hello Pi

Let's start with a Hello Pi exercise to explain the basics of evaluation in SciPy. Here is a solution file:
exercise.py
1
import numpy as np
2
3
print("Hello ", np.pi)
Copied!
Evaluation of this simple "Hello Pi" exercise is also very simple. All we have to do is to create a class extending unittest's TestCase class and declare a test method inside. The test method will get the string printed in stdout and compare it with expected output ("Hello World").
evaluate.py
1
import sys
2
from unittest import TestCase
3
4
from numpy.testing import assert_equal
5
6
class Evaluate(TestCase):
7
def test_hello_pi(self):
8
import exercise # Imports and runs student's solution
9
output = sys.stdout.getvalue() # Returns output since this function started
10
assert_equal(output, 'Hello 3.141592653589793\n')
Copied!
Let's see what we did in the above solution code.
• 1st line, the sys module is imported which will help us get the output of student's code
• 2nd line, TestCase class is imported to define our test class Evaluate and it is defined on the 4th line
• 5th line, our first test function is defined
• 6th line, the exercise module that is implemented by students is imported. Since the solution code is not in a function, it is enough to import the module to run the student's code. We have to import it inside the test function to be able to get the output.
• 7th line, we get the output of exercise module. sys.stdout.getvalue() does exactly what we want here. It will only get the strings written to stdout since the test function has started. So you cannot get any outputs written before the test_hello_world() has begun.
• 8th line asserts whether the output is correct and returns feedback if it's not.

Python 3

SciPy is based on Python and the documentation for Python covers a number of useful test scenarios. Please review those before continuing.

Example 1: NumPy

exercise.py
1
import numpy as np
2
3
a = np.array([1,2,3,4])
4
b = a.reshape(2,2)
Copied!
evaluate.py
1
from unittest import TestCase
2
3
from numpy.testing import assert_equal
4
5
class Evaluate(TestCase):
6
def test_array(self):
7
import exercise
8
assert_equal(exercise.a, [1, 2, 3, 4])
9
assert_equal(exercise.b, [[1, 2], [3, 4]])
Copied!

Example 2: Pandas

exercise.py
1
import pandas as pd
2
3
dates = pd.date_range('20130101', periods=6)
Copied!
evaluate.py
1
import datetime
2
from unittest import TestCase
3
4
from numpy.testing import assert_equal
5
6
class Evaluate(TestCase):
7
def test_array(self):
8
import exercise
9
assert_equal(exercise.dates.date(), datetime.date(2013, 1, 1))
10
assert_equal(exercise.dates[-1].date(), datetime.date(2013, 1, 6))
Copied!

exercise.py
1
import pandas as pd
2
3
Copied!
data.csv
1
3,2,1
Copied!
evaluate.py
1
from unittest import TestCase
2
3
from numpy.testing import assert_equal
4
5
class Evaluate(TestCase):
6
def test_array(self):
7
import exercise
8
assert_equal(exercise.data.to_numpy().ravel(), [3,2,1])
Copied!

exercise.py
1
import pandas as pd
2
3
Copied!
evaluate.py
1
from unittest import TestCase
2
3
class Evaluate(TestCase):
4
def test_array(self):
5
import exercise
6
self.assertTrue(exercise.data.to_numpy().size > 0)
Copied!

Example 5: SymPy

exercise.py
1
from sympy.physics.units import mass, acceleration
2
from sympy.physics.units.systems.si import dimsys_SI
3
4
F = mass * acceleration
5
6
deps = dimsys_SI.get_dimensional_dependencies(F)
Copied!
evaluate.py
1
from unittest import TestCase
2
3
from numpy.testing import assert_equal
4
5
class Evaluate(TestCase):
6
def test_array(self):
7
import exercise
8
assert_equal(exercise.deps, {'length': 1, 'mass': 1, 'time': -2})
Copied!

Example 6: SciKit Learn

exercise.py
1
from sklearn import datasets
2
from sklearn import svm
3
4
clf = svm.SVC(gamma=0.001, C=100.)
5
clf.fit(digits.data[:-1], digits.target[:-1])
6
results = clf.predict(digits.data[-1:])
Copied!
evaluate.py
1
from unittest import TestCase
2
3
from numpy.testing import assert_array_equal
4
5
class Evaluate(TestCase):
6
def test_array(self):
7
import exercise
8
assert_array_equal(exercise.results, )
Copied!