Europython 2017
Alice Harpole
import unittest
def squared(x):
	return x*x
class test_units(unittest.TestCase):
    def test_squared(self):
        self.assertTrue(squared(-5) == 25)
        self.assertTrue(squared(1e5) == 1e10)
        self.assertRaises(TypeError, squared, "A string")
				
data = rand(80,80)                # declare some random data
def func(a):                       # function to apply to data
    return a**2 * numpy.sin(a)
output = func(data)               # calculate & plot some function of random data
plt.imshow(output);  plt.colorbar();   plt.show()
def test_limits(a):
    if numpy.all(a >= 0.) and numpy.all(a <= 0.842): return True
    return False
def test_average(a):
    if numpy.isclose(numpy.average(a), 0.223, rtol=5.e-2): return True
    return False
if test_limits(output):
	print('Function output within correct limits')
else:
	print('Function output is not within correct limits')
if test_average(output):
	print('Function output has correct average')
else:
	print('Function output does not have correct average')
Function output within correct limits
Function output has correct average
				
	# use trapezium rule to find integral of sin x between 0,1
	hs = numpy.array([1. / (4. * 2.**n) for n in range(8)])
	errors = numpy.zeros_like(hs)
	for i, h in enumerate(hs):
	    xs = numpy.arange(0., 1.+h, h)
	    ys = numpy.sin(xs)
	    # use trapezium rule to approximate integral of sin(x)
	    integral_approx = sum((xs[1:] - xs[:-1]) *
				  0.5 * (ys[1:] + ys[:-1]))
	    errors[i] = -numpy.cos(1) + numpy.cos(0) - integral_approx
	plt.loglog(hs, errors, 'x', label='Error')
	plt.plot(hs, 0.1*hs**2, label=r'$h^2$')
	plt.xlabel(r'$h$'); plt.ylabel('error')