首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会议管理类的编写单元测试

会议管理类的编写单元测试
EN

Code Review用户
提问于 2020-12-30 19:21:41
回答 1查看 74关注 0票数 5

我尝试在会议类中使用unittest,但是我不确定我是否考虑了所有的条件或者应该添加更复杂的测试?

conference.py

代码语言:javascript
复制
from datetime import timedelta, datetime


class Conference:

    def __init__(self):
        self.inputs ='input.txt'
        self.outputs = 'output.txt'
        self.talks = self.proposals_extract()
        self.Track = 1
        
    def proposals_extract(self):
        talks = {}
        f = open(self.inputs)
        try:
            while True:
                line = f.readline()
                duration = ''.join(filter(lambda i: i.isdigit(), line))
                if duration:
                    talks[line] = duration
                elif (not duration) and  line:
                    print('for proposal {} no duration has been detected'.format(line))
                    break
                if not line:
                    break         
        except FileNotFoundError as e:
                raise
        f.close()
        return talks
    
    def delete_content(self, pfile):
        pfile.seek(0)
        pfile.truncate()
        
    def format_time(self, hours):
         return (datetime.min + hours).strftime('%I:%M %p')
    
    def plan(self, start, end, Output):
        start = timedelta(hours=start)
        end = timedelta(hours=end)
        
        while start < end and self.talks:
            item = self.talks.popitem()
            duration = item[1]
            proposal = item[0]
            print(self.format_time(start), ' ', proposal)
            Output.write('{}  {} '.format(self.format_time(start), proposal))
            start += timedelta(minutes=int(duration))
        start = self.format_time(hours=start) 
        return start
                
    def print_plan(self):
        O = open('output.txt', 'a')
        self.delete_content(O)
        lunch = self.format_time(timedelta(hours=12))
        while (self.talks):
            print('Track {}\n'.format(self.Track))
            O.write('Track {}\n'.format(self.Track))
            end_morning_session = self.plan(9, 12, O)
            print('{}  {} '.format(lunch, ' Lunch\n'))
            O.write('{}  {} '.format(lunch, ' Lunch\n'))
            end_afternoon_session =self.plan(13, 17, O)
            print('{}  {}'.format(end_afternoon_session, 'Networking Event\n'))
            O.write('{}  {}'.format(end_afternoon_session, 'Networking Event\n'))
            self.Track += 1
        
        O.close()
                                
if __name__ == '__main__':
    P = Conference()
    P.print_plan()

TestConference.py

代码语言:javascript
复制
import unittest
import conference as c
from datetime import timedelta, datetime
import io
from unittest.mock import mock_open, patch
from mock_open.mocks import MockOpen, FileLikeMock
import os

try:
    # pylint: disable=no-name-in-module
    from unittest.mock import patch, call, NonCallableMock, DEFAULT
except ImportError:
    from mock import patch, call, NonCallableMock, DEFAULT


class TestConference(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('setupClass')
        
    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')
        
    def setUp(self):
        print('setUp')
        f = open('input.txt')
        self.lines={line.strip('') for line in f}
        f.close()
        
    def test_proposals_extract(self):
        """Check effects of reading from an empty file."""
        myclass_instace = c.Conference()
        handle = open(myclass_instace.inputs, 'r')
        self.assertFalse(handle.closed)
        self.assertEqual('input.txt', handle.name)
        self.assertEqual('r', handle.mode)
        self.assertEqual(0, handle.tell())
        text = handle.read()
        self.assertNotEqual(0, handle.tell())
        self.assertNotEqual('', text)
        handle.close()
        self.assertTrue(handle.closed)
        talks = myclass_instace.proposals_extract()
        self.assertEqual(len(self.lines), len(talks))
        
        """Check calls made when `open` is used as a context manager."""
        with open(myclass_instace.inputs, 'r') as handle:
            self.assertFalse(handle.closed)
            self.assertEqual(myclass_instace.inputs, handle.name)
            self.assertEqual('r', handle.mode)
            self.assertEqual(0, handle.tell())
                
    def test_format_time(self):
        myclass_instace = c.Conference()
        time = myclass_instace.format_time(timedelta(hours=9))
        self.assertEqual(time,'09:00 AM')
        
    def test_plan(self):
        O = open('output.txt', 'a') 
        myclass_instace = c.Conference()
        end_session = myclass_instace.plan(9, 10, O)
        self.assertEqual(end_session,'10:00 AM')
        end_session = myclass_instace.plan(16, 17, O)
        self.assertEqual(end_session,'05:00 PM')
        O.close()
        
    def test_print_plan(self):
        myclass_instace = c.Conference()
        myclass_instace.print_plan()
        self.assertTrue(os.path.isfile(myclass_instace.outputs))
        self.assertFalse(myclass_instace.talks)

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

回答 1

Code Review用户

回答已采纳

发布于 2020-12-30 22:01:52

参数文件

Conference接受文件名作为其构造函数的参数非常简单,这将使其更加可用。

变量名

Track应该是小写的.O是变量名的糟糕选择,原因如下:

  • 应该是小写
  • 它看起来和零一样。
  • 一般来说,单字母变量名称是令人费解的,只有运气才能理解它的意思是“输出”。

P类似地应该被称为plan

上下文管理

避免分别对openfO以及close进行处理;将其放在with中。删除您的FileNotFoundError块;它没有任何用处。

线迭代

替换

代码语言:javascript
复制
        while True:
            line = f.readline()
            if not line:
                break   

使用

代码语言:javascript
复制
for line in f:

解包装

试着替换

代码语言:javascript
复制
        duration = item[1]
        proposal = item[0]

使用

代码语言:javascript
复制
proposal, duration = item

假设这个序列中只有两个项。

拼写

instace = instance

测试

整个街区:

代码语言:javascript
复制
    myclass_instace = c.Conference()
    handle = open(myclass_instace.inputs, 'r')
    self.assertFalse(handle.closed)
    self.assertEqual('input.txt', handle.name)
    self.assertEqual('r', handle.mode)
    self.assertEqual(0, handle.tell())
    text = handle.read()
    self.assertNotEqual(0, handle.tell())
    self.assertNotEqual('', text)
    handle.close()
    self.assertTrue(handle.closed)

    """Check calls made when `open` is used as a context manager."""
    with open(myclass_instace.inputs, 'r') as handle:
        self.assertFalse(handle.closed)
        self.assertEqual(myclass_instace.inputs, handle.name)
        self.assertEqual('r', handle.mode)
        self.assertEqual(0, handle.tell())

是没有用的,应该删除。您基本上是在测试Python中的文件IO工作,以及扰流板警告:确实如此。这个测试唯一有价值的部分是当您调用proposals_extract并根据已知的良好数据验证其返回值时。

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/254101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档