IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 某公司Python面试笔试题 -> 正文阅读

[开发测试]某公司Python面试笔试题

【招聘】Readme

欢迎来到编程笔试

在这个笔试题目里,你将着手编写一个实现一些简易功能的Excel。

本笔试题目为测试驱动,即:全部笔试题由20个测试案例组成,其对应文件位于/test/model/目录下。其中,test_spreadsheet1.py包含5个,test_spreadsheet2.py包含10个,test_spreadsheet3.py包含5个,为了通过上述这20个测试案例,你需要逐步完善位于/src/model/目录下的spreadsheet.py文件的代码。

请你尽可能多的完善Excel的功能来满足测试案例。你不需要完成全部案例,只需要在规定的2小时内通过尽可能多的测试案例即可。

请从第一个测试文件的第一个测试用例开始,逐步增添、重构excel的函数功能。测试案例的难度是从简到难。
如果你记不住某个内置函数库的用法,你可以上网进行查找,但是不可以和其他人进行协商。

用到的技术

  • Python
  • unittest

关于该Excel对象的基本功能介绍

该Excel只有一行。列数为A到Z,AA到ZZ等。没有储值的列数默认存储值为空字符串。

  • get(column: str), 该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get(“A1”)应返回"10"。
  • getLiteral(column: str), 该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral(“A1”)应返回"=7+3"。
  • put(column: str, value: str), 该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。

以下是给定的代码

/src/model/spreadsheet.py

# /src/model/spreadsheet.py
class Sheet:

    def get(self, column: str):
        """
        该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get("A1")应返回"10"。
        :param column: 列数
        :return: 该列存储的值,默认为空字符串
        """
        raise NotImplementedError("Not implemented!")

    def getLiteral(self, column:str):
        """
        该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral("A1")应返回"=7+3"。
        :param column: 列数
        :return: 该列存储的字符串值,默认为空字符串
        """
        raise NotImplementedError("Not implemented!")

    def put(self, column: str, value: str):
        """
        该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。
        :param column: 列数
        :param value: 在该列需要存储的值
        """
        raise NotImplementedError("Not implemented!")

/test/model/test_spreadsheet1.py

# /test/model/test_spreadsheet1.py
import unittest

from src.model.spreadsheet import Sheet


class SpreadsheetTestUnit1(unittest.TestCase):
    def test_that_cells_are_empty_by_default(self):
        """
        每列默认值为空字符串
        """
        sheet = Sheet()
        self.assertEqual("", sheet.get("A"))
        self.assertEqual("", sheet.get("ZX"))

    def test_that_text_cells_are_stored(self):
        """
        Excel可以正确地存储put的值
        """
        sheet = Sheet()
        cell = 'A'

        sheet.put(cell, "A string")
        self.assertEqual("A string", sheet.get(cell))

        sheet.put(cell, "A different string")
        self.assertEqual("A different string", sheet.get(cell))

        sheet.put(cell, "")
        self.assertEqual("", sheet.get(cell))

    def test_that_many_cells_exist(self):
        """
        Excel可以正确地覆盖之前的值
        """
        sheet = Sheet()
        sheet.put("A", "First")
        sheet.put("X", "Second")
        sheet.put("ZX", "Third")

        self.assertEqual("First", sheet.get("A"), "A")
        self.assertEqual("Second", sheet.get("X"), "X")
        self.assertEqual("Third", sheet.get("ZX"), "ZX")

        sheet.put("A", "Fourth")
        self.assertEqual("Fourth", sheet.get("A"), "A after")
        self.assertEqual("Second", sheet.get("X"), "X same")
        self.assertEqual("Third", sheet.get("ZX"), "ZX same")

    def test_that_numeric_cells_are_identified_and_stored(self):
        """
        Excel可以正确识别纯数字,对于纯数字,将多余的空格去掉。
        """
        sheet = Sheet()
        cell = 'A'

        sheet.put(cell, "X99")
        self.assertEqual("X99", sheet.get(cell))

        sheet.put(cell, "14")
        self.assertEqual("14", sheet.get(cell))

        sheet.put(cell, " 99 X")
        self.assertEqual(" 99 X", sheet.get(cell))

        sheet.put(cell, " 1234 ")
        self.assertEqual("1234", sheet.get(cell))

        sheet.put(cell, " ")
        self.assertEqual(" ", sheet.get(cell))

    def test_that_we_have_access_to_cell_literal_values_for_editing(self):
        """
        getLiteral需要返回未处理的纯字符串。
        """
        sheet = Sheet()
        cell = 'A'

        sheet.put(cell, "Some string")
        self.assertEqual("Some string", sheet.getLiteral(cell))

        sheet.put(cell, " 1234 ")
        self.assertEqual(" 1234 ", sheet.getLiteral(cell))

        sheet.put(cell, "=7")
        self.assertEqual("=7", sheet.getLiteral(cell))

/test/model/test_spreadsheet2.py

# /test/model/test_spreadsheet2.py
import unittest

from src.model.spreadsheet import Sheet


class SpreadsheetTestUnit2(unittest.TestCase):
    def test_formula_spec(self):
        """
        对于格式不正确的等式(前面多了一个空格), Excel应该不予识别。
        """
        sheet = Sheet()
        sheet.put("B", " =7")
        self.assertEqual(" =7", sheet.get("B"), "Not a formula")
        self.assertEqual(" =7", sheet.getLiteral("B"), "Unchanged")

    def test_constant_formula(self):
        """
        Excel应该正确识别等式
        """
        sheet = Sheet()
        sheet.put("A", "=7")
        self.assertEqual("=7", sheet.getLiteral("A"), "Formula")
        self.assertEqual("7", sheet.get("A"), "Value")

    def test_parentheses(self):
        """
        Excel应该正确识别包含括号的等式
        """
        sheet = Sheet()
        sheet.put("A", "=(7)")
        self.assertEqual("7", sheet.get("A"), "Parenthesis")

    def test_deep_parentheses(self):
        """
        Excel应该正确识别包含很多括号的等式
        """
        sheet = Sheet()
        sheet.put("A", "=((((10))))")
        self.assertEqual("10", sheet.get("A"), "Parenthesis")

    def test_multiply(self):
        """
        Excel应该正确计算包含乘法的等式
        """
        sheet = Sheet()
        sheet.put("A", "=2*3*4")
        self.assertEqual("24", sheet.get("A"), "Times")

    def test_add(self):
        """
        Excel应该正确计算包含加法的等式
        """
        sheet = Sheet()
        sheet.put("A", "=71+2+3")
        self.assertEqual("76", sheet.get("A"), "Add")

    def test_procedence(self):
        """
        Excel应该根据先乘后加的顺序计算
        """
        sheet = Sheet()
        sheet.put("A", "=7+2*3")
        self.assertEqual("13", sheet.get("A"), "Procedence")

    def test_full_expression(self):
        """
        Excel应该正确地计算等式
        """
        sheet = Sheet()
        sheet.put("A", "=7*(2+3)*((((2+1))))")
        self.assertEqual("105", sheet.get("A"), "Expr")

    def test_simple_formula_error(self):
        """
        Excel应该返回错误信息若等式输入有错
        """
        sheet = Sheet()
        sheet.put("A", "=7*")
        self.assertEqual("#Error", sheet.get("A"), "Error")

    def test_parenthesis_error(self):
        """
        Excel应该返回错误信息若等式输入有错
        """
        sheet = Sheet()
        sheet.put("A", "=(((((7))")
        self.assertEqual("#Error", sheet.get("A"), "Error")

/test/model/test_spreadsheet3.py

# /test/model/test_spreadsheet3.py
import unittest

from src.model.spreadsheet import Sheet


class SpreadsheetTestUnit3(unittest.TestCase):
    def test_that_cell_reference_works(self):
        """
        Excel的等式应该正确地获取其他列的值
        """
        sheet = Sheet()
        sheet.put("A", "8")
        sheet.put("B", "=A")
        self.assertEqual("8", sheet.get("B"), "cell lookup")

        sheet.put("A", "9")
        self.assertEqual("9", sheet.get("B"), "cell change propagation")

    def test_that_formulas_know_cells_and_recalculate(self):
        """
        Excel的等式应该正确地计算包含其他列的值的等式
        """
        sheet = Sheet()
        sheet.put("A", "8")
        sheet.put("B", "3")
        sheet.put("E", "=A*(A-B)+B/3")
        self.assertEqual("41", sheet.get("E"), "calculation with cells")

        sheet.put("B", "6")
        self.assertEqual("18", sheet.get("E"), "re-calculation")

    def test_that_deep_propagation_works(self):
        """
        Excel的等式应该正确地获取其他列的值
        """
        sheet = Sheet()
        sheet.put("A", "8")
        sheet.put("B", "=A")
        sheet.put("C", "=B")
        sheet.put("D", "=C")
        self.assertEqual("8", sheet.get("D"), "deep propagation")

        sheet.put("B", "6")
        self.assertEqual("6", sheet.get("D"), "deep re-calculation")

    def test_that_formula_works_with_many_cells(self):
        """
        Excel的等式应该正确地处理复杂的计算。
        """
        sheet = Sheet()
        sheet.put("A", "10")
        sheet.put("B", "=A+E")
        sheet.put("C", "=B+F")
        sheet.put("D", "=C")
        sheet.put("E", "7")
        sheet.put("F", "=B")
        sheet.put("G", "=C-B")
        sheet.put("H", "=D+G")

        self.assertEqual("34", sheet.get("D"), "multiple expressions - D")
        self.assertEqual("51", sheet.get("H"), "multiple expressions - H")

    def test_that_circular_references_admit_it(self):
        """
        如果出现了循环引用,Excel应该提示。
        """
        sheet = Sheet()
        sheet.put("A", "=A")
        self.assertEqual("#Circular", sheet.get("A"), "Detect circularity")

下面是我的答案

class Sheet:
    sheet = {}

    def get(self, column: str):
        """
        该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get("A1")应返回"10"。
        :param column: 列数
        :return: 该列存储的值,默认为空字符串
        """
        temp = self.sheet.get(column)
        if not temp:
            return ""
        # 如果是纯数字,把多余的空格去掉
        value = temp.replace(" ", "")
        if value.isdigit():
            temp = value
        # 如果是等式则进行计算
        if temp[0] == "=":
            # 如果循环引用,则进行提示
            if temp[1:] == column:
                return "#Circular"
            # 如果是包含其他列的值的等式,先把各个变量用实际值替换
            char = ""
            for i in temp[1:]:
                value = i
                if i in self.sheet:
                    value = self.get(i)
                char += value
            # 不正确的等式,进行异常捕捉
            try:
                temp = int(eval(char))
                return str(temp)
            except SyntaxError:
                return "#Error"
        return str(temp)

    def getLiteral(self, column: str):
        """
        该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral("A1")应返回"=7+3"。
        :param column: 列数
        :return: 该列存储的字符串值,默认为空字符串
        """
        temp = self.sheet.get(column)
        if not temp:
            return ""
        return temp

    def put(self, column: str, value: str):
        """
        该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。
        :param column: 列数
        :param value: 在该列需要存储的值
        """
        self.sheet.update({column: value})

测试结果

test_spreadsheet1

test_spreadsheet2test_spreadsheet3

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:23:20  更:2021-08-07 12:23:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:44:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码