首页 > 编程语言 > 详细

PyCharm实现二维最大子数组覆盖率和单元测试

时间:2021-04-01 13:47:37      阅读:25      评论:0      收藏:0      [点我收藏+]

一、本文目标

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文件也可以查看单元测试代码的覆盖情况

 

 技术分享图片

 五、作者的留言

对于PyCharm的代码单元测试与测试覆盖率有什么不懂之处,欢迎评论留言询问,作者会及时回应,如有不足之处,请多多指教!

PyCharm实现二维最大子数组覆盖率和单元测试

原文:https://www.cnblogs.com/lengend/p/14604531.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!