一、本文目标
1、用指定的txt文本文件形式读取二维列表
2、对列表数组进行最大连续子数组之和的计算
3、对最大连续子数组方法进行单元测试和代码覆盖率测试
4、分析单元测试以及代码覆盖率。
二、实现过程
求二维列表最大子数组(我们要求二维数组的子数组必须是矩形的,如下图)
实现的Python源代码如下
class SumMaxNum():
def function(self,lists):#一维列表最大子数组之和
max_sum = lists[0]
pre_sum = 0
for i in lists:
if pre_sum < 0:
pre_sum = i
else:
pre_sum += i
if pre_sum > max_sum:
max_sum = pre_sum
return max_sum
def RectangelSum(self,m):#二维列表最大矩形子数组之和
'''算法思想:
依次让每一个数据和右边相加比较后取大,在和 '''
maxsum = 0
for top in range(0, len(m)):#遍历子表个数
for left in range(0, len(m[0])):#遍历子表元素
for bottom in range(top, len(m)):#从上到下
for right in range(left, len(m[0])):#从左到右
thissum = 0
for row in range(top, bottom+1):
for col in range(left, right+1):
thissum += m[row][col]
maxsum = max(thissum, maxsum)#取每次求和的较大者
return maxsum
def readtxt(self, txt):
'''读文件操作'''
data = list()
flag = 0
for line in open(txt, 'r'):
flag = flag + 1
if flag > 2:#1,2行表示几行几列,二位列表从第3行开始
data.append(list(map(int, line.strip(",\n").split(","))))
return data
if __name__ == '__main__':
a = SumMaxNum()
print(a.function([-2, 6, -1, 5, 4, -7, 2, 3]))
print(a.readtxt("a.txt"))
print(a.RectangelSum(a.readtxt("a.txt")))
其中a.txt文件如下:
3,6分别表示3行6列。
运行的结果:
三、单元测试
3.1、单元测试的过程
在PyCharm的需要测试文件的当前目录选择new --> python file --> python unit test,然后确认 ,如图
之后,导入需要测试类或者函数,编写测试组。本文档测视组如3.2
3.2、单元测试的源码和结果
单元测试源码:
import unittest
from Sum import SumMaxNum
class MyTestCase(unittest.TestCase):
def test_something(self):
self.assertEqual(True, False)
def test1(self):
ts = SumMaxNum()
return self.assertEqual(ts.function([-2, 6, -1, 5, 4, -7, 2, 3]), 14)
def test2(self):
ts = SumMaxNum()
return self.assertEqual(ts.RectangelSum(ts.readtxt("a.txt")),28)
def test3(self):
ts = SumMaxNum()
return self.assertEqual(ts.RectangelSum(ts.readtxt("a.txt")),27)#错误组,测试列举错误
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(MyTestCase('test1'))
suite.addTest(MyTestCase('test2'))
suite.addTest(MyTestCase('test3'))
runner = unittest.TextTestRunner()
runner.run(suite)
import cProfile//需要pip命令安装,
cProfile.run("SumMaxNum().RectangelSum(SumMaxNum().readtxt('a.txt'))")//测试效能
结果:
文字解释:
- tottime:函数内部消耗的总时间。(可以帮助优化)
- percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。
- cumtime:之前所有子函数消费时间的累计和。
- filename:lineno(function):被分析函数所在文件名、行号、函数名。
四、代码覆盖率测试(含有详细的实现过程)
4.1、PyCharm测试覆盖率方法.
注意:PyCharm后面简称PC
Coverage作为Python的一个第三方库,使用时需要先安装,使用pip命令进行安装。
安装命令:pip install coverage,当然PC也可以通过file目录下的seting加入,如图中的“+”号.
然后搜索coverage,然后install Package,便配置好了coverage。
4.2、实现过程
4.2.1、生成.coverage文件
在PC的Terminal下输入coverage run SumTest.py(我的测试文件是SumTest.py,这里需要输入自己需要测试的文件),
然后运行,就会在自己测试的.py文件的同级目录下生成一个.coverage文件和,如图
4.2.2、使用命令:coverage report查看报告
由结果可以得知,执行的SumTest.py文件,代码覆盖率是95%
结果展示中的字段含义:
- tmts:语句总数
- Miss:未执行到的语句数
- Cover:覆盖率,计算公式 Cover=(Stmts-Miss)/Stmts
4.2.3、生成HTML报告文件
使用命令生成HTML报告:coverage html -d covhtml
其中参数-d是指定生成的html所在的文件夹名,命令执行完成后会生成一个covhtmll文件夹
直接在浏览器中打开covhtml文件假中的index.html文件查看代码覆盖率
结果可以得知,执行的SumTest.py文件,代码覆盖率是95%,和上面的使用命令:coverage report查看报告一样。
4.2.4、查看未覆盖地代码行
在浏览器中直接打开Sum.py文件,可高亮显示未覆盖的代码行,以及文件的统计数据。
同样打开SumTest.py文件也可以查看单元测试代码的覆盖情况