diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py
index ce5287c..6ebe8d3 100644
--- a/Lib/test/test_audioop.py
+++ b/Lib/test/test_audioop.py
@@ -1,286 +1,169 @@
-# Test audioop.
 import audioop
-from test.test_support import verbose
+import unittest
+from test.test_support import run_unittest
+
 
 def gendata1():
     return '\0\1\2'
 
 def gendata2():
-    if verbose:
-        print 'getsample'
     if audioop.getsample('\0\1', 2, 0) == 1:
         return '\0\0\0\1\0\2'
     else:
         return '\0\0\1\0\2\0'
 
 def gendata4():
-    if verbose:
-        print 'getsample'
     if audioop.getsample('\0\0\0\1', 4, 0) == 1:
         return '\0\0\0\0\0\0\0\1\0\0\0\2'
     else:
         return '\0\0\0\0\1\0\0\0\2\0\0\0'
 
-def testmax(data):
-    if verbose:
-        print 'max'
-    if audioop.max(data[0], 1) != 2 or \
-              audioop.max(data[1], 2) != 2 or \
-              audioop.max(data[2], 4) != 2:
-        return 0
-    return 1
+data = [gendata1(), gendata2(), gendata4()]
 
-def testminmax(data):
-    if verbose:
-        print 'minmax'
-    if audioop.minmax(data[0], 1) != (0, 2) or \
-              audioop.minmax(data[1], 2) != (0, 2) or \
-              audioop.minmax(data[2], 4) != (0, 2):
-        return 0
-    return 1
 
-def testmaxpp(data):
-    if verbose:
-        print 'maxpp'
-    if audioop.maxpp(data[0], 1) != 0 or \
-              audioop.maxpp(data[1], 2) != 0 or \
-              audioop.maxpp(data[2], 4) != 0:
-        return 0
-    return 1
+class TestAudioop(unittest.TestCase):
 
-def testavg(data):
-    if verbose:
-        print 'avg'
-    if audioop.avg(data[0], 1) != 1 or \
-              audioop.avg(data[1], 2) != 1 or \
-              audioop.avg(data[2], 4) != 1:
-        return 0
-    return 1
+    def test_max(self):
+        self.assertEqual(audioop.max(data[0], 1), 2)
+        self.assertEqual(audioop.max(data[1], 2), 2)
+        self.assertEqual(audioop.max(data[2], 4), 2)
 
-def testavgpp(data):
-    if verbose:
-        print 'avgpp'
-    if audioop.avgpp(data[0], 1) != 0 or \
-              audioop.avgpp(data[1], 2) != 0 or \
-              audioop.avgpp(data[2], 4) != 0:
-        return 0
-    return 1
+    def test_minmax(self):
+        self.assertEqual(audioop.minmax(data[0], 1), (0, 2))
+        Self.assertEqual(audioop.minmax(data[1], 2), (0, 2))
+        self.assertEqual(audioop.minmax(data[2], 4), (0, 2))
 
-def testrms(data):
-    if audioop.rms(data[0], 1) != 1 or \
-              audioop.rms(data[1], 2) != 1 or \
-              audioop.rms(data[2], 4) != 1:
-        return 0
-    return 1
+    def test_maxpp(self):
+        self.assertEqual(audioop.maxpp(data[0], 1), 0)
+        self.assertEqual(audioop.maxpp(data[1], 2), 0)
+        self.assertEqual(audioop.maxpp(data[2], 4), 0)
 
-def testcross(data):
-    if verbose:
-        print 'cross'
-    if audioop.cross(data[0], 1) != 0 or \
-              audioop.cross(data[1], 2) != 0 or \
-              audioop.cross(data[2], 4) != 0:
-        return 0
-    return 1
+    def test_avg(self):
+        self.assertEqual(audioop.avg(data[0], 1), 1)
+        self.assertEqual(audioop.avg(data[1], 2), 1)
+        self.assertEqual(audioop.avg(data[2], 4), 1)
 
-def testadd(data):
-    if verbose:
-        print 'add'
-    data2 = []
-    for d in data:
-        str = ''
-        for s in d:
-            str = str + chr(ord(s)*2)
-        data2.append(str)
-    if audioop.add(data[0], data[0], 1) != data2[0] or \
-              audioop.add(data[1], data[1], 2) != data2[1] or \
-              audioop.add(data[2], data[2], 4) != data2[2]:
-        return 0
-    return 1
+    def test_avgpp(self):
+        self.assertEqual(audioop.avgpp(data[0], 1), 0)
+        self.assertEqual(audioop.avgpp(data[1], 2), 0)
+        self.assertEqual(audioop.avgpp(data[2], 4), 0)
 
-def testbias(data):
-    if verbose:
-        print 'bias'
-    # Note: this test assumes that avg() works
-    d1 = audioop.bias(data[0], 1, 100)
-    d2 = audioop.bias(data[1], 2, 100)
-    d4 = audioop.bias(data[2], 4, 100)
-    if audioop.avg(d1, 1) != 101 or \
-              audioop.avg(d2, 2) != 101 or \
-              audioop.avg(d4, 4) != 101:
-        return 0
-    return 1
+    def test_rms(self):
+        self.assertEqual(audioop.rms(data[0], 1), 1)
+        self.assertEqual(audioop.rms(data[1], 2), 1)
+        self.assertEqual(audioop.rms(data[2], 4), 1)
 
-def testlin2lin(data):
-    if verbose:
-        print 'lin2lin'
-    # too simple: we test only the size
-    for d1 in data:
-        for d2 in data:
-            got = len(d1)//3
-            wtd = len(d2)//3
-            if len(audioop.lin2lin(d1, got, wtd)) != len(d2):
-                return 0
-    return 1
+    def test_cross(self):
+        self.assertEqual(audioop.cross(data[0], 1), 0)
+        self.assertEqual(audioop.cross(data[1], 2), 0)
+        self.assertEqual(audioop.cross(data[2], 4), 0)
 
-def testadpcm2lin(data):
-    # Very cursory test
-    if audioop.adpcm2lin('\0\0', 1, None) != ('\0\0\0\0', (0,0)):
-        return 0
-    return 1
+    def test_add(self):
+        data2 = []
+        for d in data:
+            str = ''
+            for s in d:
+                str = str + chr(ord(s)*2)
+            data2.append(str)
+        self.assertEqual(audioop.add(data[0], data[0], 1), data2[0])
+        self.assertEqual(audioop.add(data[1], data[1], 2), data2[1])
+        self.assertEqual(audioop.add(data[2], data[2], 4), data2[2])
 
-def testlin2adpcm(data):
-    if verbose:
-        print 'lin2adpcm'
-    # Very cursory test
-    if audioop.lin2adpcm('\0\0\0\0', 1, None) != ('\0\0', (0,0)):
-        return 0
-    return 1
+    def test_bias(self):
+        # Note: this test assumes that avg() works
+        d1 = audioop.bias(data[0], 1, 100)
+        d2 = audioop.bias(data[1], 2, 100)
+        d4 = audioop.bias(data[2], 4, 100)
+        self.assertEqual(audioop.avg(d1, 1), 101)
+        self.assertEqual(audioop.avg(d2, 2), 101)
+        self.assertEqual(audioop.avg(d4, 4), 101)
 
-def testlin2alaw(data):
-    if verbose:
-        print 'lin2alaw'
-    if audioop.lin2alaw(data[0], 1) != '\xd5\xc5\xf5' or \
-              audioop.lin2alaw(data[1], 2) != '\xd5\xd5\xd5' or \
-              audioop.lin2alaw(data[2], 4) != '\xd5\xd5\xd5':
-        return 0
-    return 1
+    def test_lin2lin(self):
+        # too simple: we test only the size
+        for d1 in data:
+            for d2 in data:
+                got = len(d1)//3
+                wtd = len(d2)//3
+                self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2))
 
-def testalaw2lin(data):
-    if verbose:
-        print 'alaw2lin'
-    # Cursory
-    d = audioop.lin2alaw(data[0], 1)
-    if audioop.alaw2lin(d, 1) != data[0]:
-        return 0
-    return 1
+    def test_adpcm2lin(self):
+        # Very cursory test
+        self.assertEqual(audioop.adpcm2lin('\0\0', 1, None), ('\0\0\0\0', (0,0)))
 
-def testlin2ulaw(data):
-    if verbose:
-        print 'lin2ulaw'
-    if audioop.lin2ulaw(data[0], 1) != '\xff\xe7\xdb' or \
-              audioop.lin2ulaw(data[1], 2) != '\xff\xff\xff' or \
-              audioop.lin2ulaw(data[2], 4) != '\xff\xff\xff':
-        return 0
-    return 1
+    def test_lin2adpcm(self):
+        # Very cursory test
+        self.assertEqual(audioop.lin2adpcm('\0\0\0\0', 1, None), ('\0\0', (0,0)))
 
-def testulaw2lin(data):
-    if verbose:
-        print 'ulaw2lin'
-    # Cursory
-    d = audioop.lin2ulaw(data[0], 1)
-    if audioop.ulaw2lin(d, 1) != data[0]:
-        return 0
-    return 1
+    def test_lin2alaw(self):
+        self.assertEqual(audioop.lin2alaw(data[0], 1), '\xd5\xc5\xf5')
+        self.assertEqual(audioop.lin2alaw(data[1], 2), '\xd5\xd5\xd5')
+        self.assertEqual(audioop.lin2alaw(data[2], 4), '\xd5\xd5\xd5')
 
-def testmul(data):
-    if verbose:
-        print 'mul'
-    data2 = []
-    for d in data:
-        str = ''
-        for s in d:
-            str = str + chr(ord(s)*2)
-        data2.append(str)
-    if audioop.mul(data[0], 1, 2) != data2[0] or \
-              audioop.mul(data[1],2, 2) != data2[1] or \
-              audioop.mul(data[2], 4, 2) != data2[2]:
-        return 0
-    return 1
+    def test_alaw2lin(self):
+        # Cursory
+        d = audioop.lin2alaw(data[0], 1)
+        self.assertEqual(audioop.alaw2lin(d, 1), data[0])
 
-def testratecv(data):
-    if verbose:
-        print 'ratecv'
-    state = None
-    d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
-    d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
-    if d1 + d2 != '\000\000\001\001\002\001\000\000\001\001\002':
-        return 0
-    return 1
+    def test_lin2ulaw(self):
+        self.assertEqual(audioop.lin2ulaw(data[0], 1), '\xff\xe7\xdb')
+        self.assertEqual(audioop.lin2ulaw(data[1], 2), '\xff\xff\xff')
+        self.assertEqual(audioop.lin2ulaw(data[2], 4), '\xff\xff\xff')
 
-def testreverse(data):
-    if verbose:
-        print 'reverse'
-    if audioop.reverse(data[0], 1) != '\2\1\0':
-        return 0
-    return 1
+    def test_ulaw2lin(self):
+        # Cursory
+        d = audioop.lin2ulaw(data[0], 1)
+        self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
 
-def testtomono(data):
-    if verbose:
-        print 'tomono'
-    data2 = ''
-    for d in data[0]:
-        data2 = data2 + d + d
-    if audioop.tomono(data2, 1, 0.5, 0.5) != data[0]:
-        return 0
-    return 1
+    def test_mul(self):
+        data2 = []
+        for d in data:
+            str = ''
+            for s in d:
+                str = str + chr(ord(s)*2)
+            data2.append(str)
+        self.assertEqual(audioop.mul(data[0], 1, 2), data2[0])
+        self.assertEqual(audioop.mul(data[1],2, 2), data2[1])
+        self.assertEqual(audioop.mul(data[2], 4, 2), data2[2])
 
-def testtostereo(data):
-    if verbose:
-        print 'tostereo'
-    data2 = ''
-    for d in data[0]:
-        data2 = data2 + d + d
-    if audioop.tostereo(data[0], 1, 1, 1) != data2:
-        return 0
-    return 1
+    def test_ratecv(self):
+        state = None
+        d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+        d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+        self.assertEqual(d1 + d2, '\000\000\001\001\002\001\000\000\001\001\002')
 
-def testfindfactor(data):
-    if verbose:
-        print 'findfactor'
-    if audioop.findfactor(data[1], data[1]) != 1.0:
-        return 0
-    return 1
+    def test_reverse(self):
+        self.assertEqual(audioop.reverse(data[0], 1), '\2\1\0')
 
-def testfindfit(data):
-    if verbose:
-        print 'findfit'
-    if audioop.findfit(data[1], data[1]) != (0, 1.0):
-        return 0
-    return 1
+    def test_tomono(self):
+        data2 = ''
+        for d in data[0]:
+            data2 = data2 + d + d
+        self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
 
-def testfindmax(data):
-    if verbose:
-        print 'findmax'
-    if audioop.findmax(data[1], 1) != 2:
-        return 0
-    return 1
+    def test_tostereo(self):
+        data2 = ''
+        for d in data[0]:
+            data2 = data2 + d + d
+        self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
 
-def testgetsample(data):
-    if verbose:
-        print 'getsample'
-    for i in range(3):
-        if audioop.getsample(data[0], 1, i) != i or \
-                  audioop.getsample(data[1], 2, i) != i or \
-                  audioop.getsample(data[2], 4, i) != i:
-            return 0
-    return 1
+    def test_findfactor(self):
+        self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
 
-def testone(name, data):
-    try:
-        func = eval('test'+name)
-    except NameError:
-        print 'No test found for audioop.'+name+'()'
-        return
-    try:
-        rv = func(data)
-    except 'xx':
-        print 'Test FAILED for audioop.'+name+'() (with an exception)'
-        return
-    if not rv:
-        print 'Test FAILED for audioop.'+name+'()'
+    def test_findfit(self):
+        self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
+
+    def test_findmax(self):
+        self.assertEqual(audioop.findmax(data[1], 1), 2)
+
+    def test_getsample(self):
+        for i in range(3):
+            self.assertEqual(audioop.getsample(data[0], 1, i), i)
+            self.assertEqual(audioop.getsample(data[1], 2, i), i)
+            self.assertEqual(audioop.getsample(data[2], 4, i), i)
+
 
 def test_main():
-    data = [gendata1(), gendata2(), gendata4()]
-    names = dir(audioop)
-    # We know there is a routine 'add'
-    routines = []
-    for n in names:
-        if type(eval('audioop.'+n)) == type(audioop.add):
-            routines.append(n)
-    for n in routines:
-        testone(n, data)
-
-
+    run_unittest(TestAudioop)
 
 if __name__ == '__main__':
     test_main()
