一、本文目标

1、用指定的txt文本文件形式读取二维列表

2、对列表数组进行最大连续子数组之和的计算

3、对最大连续子数组方法进行单元测试和代码覆盖率测试

4、分析单元测试以及代码覆盖率。

二、实现过程

求二维列表最大子数组(我们要求二维数组的子数组必须是矩形的,如下图)

pytorch二维张量如何每行取出一个元素 pycharm二维数组_单元测试

实现的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文件如下:

 

 

pytorch二维张量如何每行取出一个元素 pycharm二维数组_单元测试_02

 

  3,6分别表示3行6列。

运行的结果:

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_03

  

三、单元测试

3.1、单元测试的过程

在PyCharm的需要测试文件的当前目录选择new -->  python  file   --> python unit test,然后确认 ,如图

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_04

   之后,导入需要测试类或者函数,编写测试组。本文档测视组如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'))")//测试效能

  结果:

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_05

 

 

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_06

 

文字解释:

  • tottime:函数内部消耗的总时间。(可以帮助优化)
  • percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。
  • cumtime:之前所有子函数消费时间的累计和。
  • filename:lineno(function):被分析函数所在文件名、行号、函数名。

四、代码覆盖率测试(含有详细的实现过程)

4.1、PyCharm测试覆盖率方法.

注意:PyCharm后面简称PC

Coverage作为Python的一个第三方库,使用时需要先安装,使用pip命令进行安装。
安装命令:pip install coverage,当然PC也可以通过file目录下的seting加入,如图中的“+”号.

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_07

   然后搜索coverage,然后install Package,便配置好了coverage。

pytorch二维张量如何每行取出一个元素 pycharm二维数组_单元测试_08

4.2、实现过程

4.2.1、生成.coverage文件

在PC的Terminal下输入coverage run SumTest.py(我的测试文件是SumTest.py,这里需要输入自己需要测试的文件),

然后运行,就会在自己测试的.py文件的同级目录下生成一个.coverage文件和,如图

pytorch二维张量如何每行取出一个元素 pycharm二维数组_单元测试_09

 

 4.2.2、使用命令:coverage report查看报告

pytorch二维张量如何每行取出一个元素 pycharm二维数组_html_10

   由结果可以得知,执行的SumTest.py文件,代码覆盖率是95%

结果展示中的字段含义:

  • tmts:语句总数
  • Miss:未执行到的语句数
  • Cover:覆盖率,计算公式 Cover=(Stmts-Miss)/Stmts

 

4.2.3、生成HTML报告文件

使用命令生成HTML报告:coverage html -d covhtml

其中参数-d是指定生成的html所在的文件夹名,命令执行完成后会生成一个covhtmll文件夹

pytorch二维张量如何每行取出一个元素 pycharm二维数组_单元测试_11

直接在浏览器中打开covhtml文件假中的index.html文件查看代码覆盖率

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_12

 

 结果可以得知,执行的SumTest.py文件,代码覆盖率是95%,和上面的使用命令:coverage report查看报告一样。

4.2.4、查看未覆盖地代码行

在浏览器中直接打开Sum.py文件,可高亮显示未覆盖的代码行,以及文件的统计数据。

pytorch二维张量如何每行取出一个元素 pycharm二维数组_html_13

  同样打开SumTest.py文件也可以查看单元测试代码的覆盖情况

pytorch二维张量如何每行取出一个元素 pycharm二维数组_代码覆盖率_14