EE308_Lab11

厦大打工人 2021-12-16 01:08:17
The Link Your Classhttps://bbs.csdn.net/forums/MUEE308FZ?category=0
The Link of Requirement of This Assignmenthttps://bbs.csdn.net/topics/603748107
The Aim of This AssignmentUnit Test Tutorial (for python)
MU STU ID and FZU STU ID19105185_831901317

Aim

This lab is aim to learn something about unit test. This lab contains task of python and java. I choose python with the toolbox called unittest which is already inside python.

Task

📔1.unittest assert test

lab_11.py

import unittest, random


# Test Class
class MyClass(object):

    @classmethod
    def sum(self, a, b):
        return a + b

    @classmethod
    def div(self, a, b):
        return a / b

    @classmethod
    def retrun_None(self):
        return


class MyTest(unittest.TestCase):
    # assertEqual()
    def test_assertEqual(self):
        # test if a+b equals sum or not
        try:
            a, b = 1, 2
            sum = 3
            self.assertEqual(a + b, sum, 'assert failed!,%s + %s != %s' % (a, b, sum))
        except AssertionError as e:
            print(e)

    # assertNotEqual()
    def test_assertNotEqual(self):
        # fix missing three lines of codes below ‘try’, test if b-a equals res or not
        try:
            a, b = 1, 2
            res = 4
            self.assertNotEqual(a - b, res, 'assert failed!,%s + %s != %s' % (a, b, res))
        except AssertionError as e:
            print(e)

        # assertTrue()
    def test_assertTrue(self):

        try:
            self.assertTrue(1 == 1, "False expression")
        except AssertionError as e:
            print(e)

    # assertFalse()
    def test_assertFalse(self):
        # fix missing codes below ‘try’, only a line of codes needed
        try:
            self.assertFalse(2 == 1, "False expression")
        except AssertionError as e:
            print(e)

    # assertIs()
    def test_assertIs(self):
        # test a and b are totally same
        try:
            a = 12
            b = a
            self.assertIs(a, b, "%s and %s are not same" % (a, b))
        except AssertionError as e:
            print(e)

    # assertIsInstance()
    def test_assertIsInstance(self):
        # fix missing codes below ‘y=object’ to test type(x) != y, only a line of codes needed
        try:
            x = MyClass
            y = object
            self.assertIsInstance(x, y, "%s and %s are not same" % (type(x), y))
        except AssertionError as e:
            print(e)

if __name__ == '__main__':
    # run unittest
    unittest.main()

The result of running through the code is:

💻2.unittest test groups

Calc.py

class Calc(object):

    def add(self, *d):
        #
        result = 0
        for i in d:
            result += i
        return result

    def mul(self, *d):
        #
        result = 1
        for i in d:
            result = result * i
        return result


    def sub(self, a, *d):
        #
        result = a
        for i in d:
            result = result - i
        return result


    def div(self, a, *d):
        #
        result = a
        for i in d:
            result = result / i
        return result

TestCalc.py

# TestCalc.py

import unittest
import random
from Calc import Calc

class TestCalcFunctions(unittest.TestCase):

    def setUp(self):
        self.c = Calc()
        print("setup completed!")

    def test_sum(self):
        self.assertTrue(self.c.add(1, 2, 3, 4) == 10)

    def test_sub(self):
        self.assertTrue(self.c.sub(10, 3) == 7)
        # fix a line of codes to test c.sub(self, a, *b) method

    def test_mul(self):
        self.assertTrue(self.c.mul(3, 4) == 12)
        # fix a line of codes to test c.mul(self, *b) method

    def test_div(self):
        self.assertTrue(self.c.div(4, 2) == 2)
        # fix a line of codes to test c.div(self, a, *b) method

    def tearDown(self):
        print("test completed!")

    def tearDown(self):
        print("tearDown completed")

if __name__ == '__main__':
    unittest.main()

The result of running through the code is:

 lab11_3.py

# unittest_suite.py

import random
import unittest
from TestCalc import TestCalcFunctions


class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = list(range(10))

    def tearDown(self):
        pass

    def test_choice(self):
        # chose an element from seq randomly
        element = random.choice(self.seq)
        # check element is truly in the sequence
        self.assertTrue(element in self.seq)

    def test_sample(self):
        # if codes raise exception
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)

        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)


class TestDictValueFormatFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = list(range(10))

    def tearDown(self):
        pass

    def test_shuffle(self):
        # shuffle sequence
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(10)))
        # check TypeError exception
        self.assertRaises(TypeError, random.shuffle, (1, 2, 3))

if __name__ == '__main__':
    # get all test methods start with ‘test’ and return a suite
    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
    # please fix another two suite, suite2 of TestCalcFunctions and suite3 of TestDictValueFormatFunctions
    suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCalcFunctions)
    suite3 = unittest.TestLoader().loadTestsFromTestCase(TestDictValueFormatFunctions)
    # put more test class into suite
    # you can change suites’ order, like [suite1, suite2, suite3]
    suite = unittest.TestSuite([suite2, suite1, suite3])
    # set verbosity = 2 you could get more detailed information
    unittest.TextTestRunner(verbosity=2).run(suite)

The result of running through the code is:

 📊3.unittest skip test

 lab11_4.py

# encoding=utf-8

import random, sys, unittest


class TestSeqFunctions(unittest.TestCase):
    a = 1

    def setUp(self):
        self.seq = list(range(20))

    @unittest.skip("skipping")  # skip this method anyway
    def test_shuffle(self):
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(20)))
        self.assertRaises(TypeError, random.shuffle, (1, 2, 3))

    # add a line of annotation that skip this method if a>5
    @unittest.skipIf(a > 5, "skip this method if a>5")
    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    # add a line of annotation that skip if not in linux platform
    @unittest.skipIf(sys.platform != "Linux", "skip Linux")
    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)


if __name__ == "__main__":
    # unittest.main()
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSeqFunctions)
    suite = unittest.TestSuite(suite)
    unittest.TextTestRunner(verbosity=2).run(suite)

 The result of running through the code is:

💾4.unittest Run test under numerical order or alpha order

lab11_5.py
# encoding=utf-8

import unittest
from Calc import Calc


class MyTest(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        print("init Calc before unittest")
        self.c = Calc()

    # rename the four methods bellow, make sure print queue will be :
    # run add()
    # run sub()
    # run mul()
    # run div()

    # P.S.: test case must starts with ‘test’
    def test_1_add(self):
        print("run add()")
        self.assertEqual(self.c.add(1, 2, 12), 15, 'test add fail')

    def test_2_sub(self):
        print("run sub()")
        self.assertEqual(self.c.sub(2, 1, 3), -2, 'test sub fail')

    def test_3_mul(self):
        print("run mul()")
        self.assertEqual(Calc.mul(self.c, 2, 3, 5), 30, 'test mul fail')

    def test_4_div(self):
        print("run div()")
        self.assertEqual(Calc.div(self.c, 8, 2, 4), 1, 'test div fail')


if __name__ == '__main__':
    unittest.main()

  The result of running through the code is:

📝5.unittest Time Test 

lab11_6.py

import time
import timeout_decorator
import unittest


class timeoutTest(unittest.TestCase):

    # set a time decorator(annotation) which will be triggered after 5s’ running
    @timeout_decorator.timeout(5)
    def testtimeout(self):
        print("Start")

        for i in range(1, 10):
            time.sleep(1)
            print("%d seconds have passed" % i)


if __name__ == "__main__":
    unittest.main()

There is no virtual machine on my computer, so I can't complete the last task. In lack of the module "timeout_decorator", we can not execute the code correctly.

🎆Conclusion

Through this experiment, I learned how to test Python code, and knew the importance and convenience of testing for code.

...全文
175 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

183

社区成员

发帖
与我相关
我的任务
社区描述
福州大学 梅努斯国际工程学院 软件工程 教学
软件工程 高校
社区管理员
  • 单步调试
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧