自动测试LeetCode用例方法

news2024/9/25 15:27:43

自动合并测试LeetCode解题方法

在leetcode.com上答题,Run Code或者Sumbmit通常要Spending一会,如果提交一次就Accepted那还好,如果反复Wrong Answer,很耽误时间。为了调高效率和减少挫折(来回提交,一直Wrong Answer倍受打击),我采取在本地Jupyter notebook上coding,测试通过后再提交的方式。本篇主要介绍自动测试的方法。

1. LeetCode模式

打开leetcode一道题后,左侧有一个Description选项卡,该选项卡面板内有题目、命题描述、还列举了多个Example,每个Example都有一个Input和一个Output,有的还会有一个Explanation;右侧是coding区,coding区自动生成 class Solution模板。

class Solution: def method(self,**kwargs):

例如,第1071号题Decription区的Example内容如下

1071号题coding区初始化模板如下

2. Jupyter notebook编写代码

将LeetCode中coding模板内容复制到jupyter notebook中,编写解题代码。假如1071号题的代码如下。

class Solution:
    def gcdOfStrings(self, str1: str, str2: str) -> str:
        if len(str1) < len(str2):
            tmp, str2, str1 = str2, str1, tmp
        len_str2, len_str1 = len(str2), len(str1)
        
        for i in range(1,len_str2+1):
            d2,m2 = divmod(len(str2),i)
            if m2==0 and str2==str2[:d2]*i:
                d1, m1 = divmod(len(str1),d2)
                if m1==0 and str1==str2[:d2]*d1:
                    return str2[:d2]
        return ""

3. 手动逐一测试

手动逐一测试,就是编写好method内容后,实例化Solution,然后复制Decription中每个Example中的Input,传入实例的方法,执行后观察结果是否与Example中Output一致。

# 实列化类
s = Solution()
# 测试Example中的用例1
# Input: str1 = "ABCABC", str2 = "ABC"
# Output: "ABC"

str1 = "ABCABC"
str2 = "ABC"
s.gcdOfStrings(str1,str2)

'ABC'
# 测试Example中的用例2
# Input: str1 = "ABABAB", str2 = "ABAB"
# Output: "AB"

str1 = "ABABAB"
str2 = "ABAB"
s.gcdOfStrings(str1,str2)
'AB'
# 测试Example中的用例3
# Input: str1 = "LEET", str2 = "CODE"
# Output: ""

str1 = "LEET"
str2 = "CODE"
s.gcdOfStrings(str1,str2)
''
# 测试Example中的用例4
# Input: str1 = "ABCDEF", str2 = "ABC"
# Output: ""

str1 = "ABCDEF"
str2 = "ABC"
s.gcdOfStrings(str1,str2)

''

4. 自动合并测试

4.1 复制测试用例

从LeetCode问题页面复制所有Example内容,赋值给str_Examples。这里用3对双引号,内容可以原封不动。Example描述有规律,而且每个题的Example描述都是同样的模式,所以我们可以定义一个通用方法来获取测试用例。

str_Examples ="""Example 1:

Input: str1 = "ABCABC", str2 = "ABC"
Output: "ABC"
Example 2:

Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"
Example 3:

Input: str1 = "LEET", str2 = "CODE"
Output: ""
Example 4:

Input: str1 = "ABCDEF", str2 = "ABC"
Output: ""
"""

4.2 定义获取用例方法

  • 目标是把Input、Output提取出来,并成对组织好。
  • 通过观察,可采用正则化split、字符串split、replace、strip等方法提取Input、Output内容
  • 输入参数和输出存入list,每个用例可能有多个参数,所以用例参数用dict装载,方便调用测试方法时用**kwargs传入。

注意:因为输入用例文档用的"“”“”,引号里内容还含有双引号",split后会把里面的引号当做字符内容,导致结果出乎意料。

def get_test_cases(str_examples):
    import re
    params =re.split('Example.+?:',str_examples.replace('\n','').replace(' ',''))[1:]
    cases_arg, cases_ans = [], []
    for param in params:
        kawargs = {}
        args_,ans = param.split('Output:')
        args_ = args_.replace('Input:','').strip().split(',')
        cases_ans.append(ans)
        for arg in args_:
            key,val = arg.split("=")
            kawargs[key] = val
        cases_arg.append(kawargs)
    return zip(cases_arg, cases_ans)

4.3 定义自动测试方法

  • leetcode每个题生成的默认代码类名都是Solution,但是函数名根据题目来取,因题而异。dir(Solution())能够获取Solution的方法名列表,前面部分是内建方法名,最后一个是自定义的解题方法(这里考虑只有一个自建函数)。用dir(Solution())[-1]获取函数名,然后使用getattr获取实例方法f。
  • 传入参数为get_usecases返回的结果——zip打包的测试用例输入和输出,for迭代或取每一个测试用例的输入参数kwargs(Example中的Input)和输入answer(Example中的Output)。
  • 迭代测试用例,断言 f(**kwargs) == answer 。如果每个断言成功,返回’Accepted’,否则try…except捕获断言失败,返回’Wrong Answer’。
def auto_test(test_cases):
    f = getattr(Solution(), dir(Solution())[-1])
    try:
        for kwargs, answer in test_cases:
            print(kawargs,answer)
            assert f(**kwargs) == answer        
        return 'Accepted'
    except Exception as e:  
        print(e)
        return 'Wrong Answer'

4.4 what?! 神奇问题bug ?

  • 先调用get_test_cases获取测试用例,然后将结果传入auto_test进行测试,结果是’Wrong Answer’;
  • 直接调用auto_test(get_test_cases()),结果也是’Wrong Answer’。
  • 然而调用get_test_cases获取测试用例test_cases后,先迭代一遍test_cases,再将test_cases传入auto_test,结果为’Accepted’。
test_cases = get_test_cases(str_Examples)
auto_test(test_cases)
name 'kawargs' is not defined

'Wrong Answer'
auto_test(get_test_cases(str_Examples))
name 'kawargs' is not defined

'Wrong Answer'
for input_args,out in test_cases:
    print(input_args, out)
auto_test(test_cases)    

{'str1': '"ABABAB"', 'str2': '"ABAB"'} "AB"
{'str1': '"LEET"', 'str2': '"CODE"'} ""
{'str1': '"ABCDEF"', 'str2': '"ABC"'} ""


'Accepted'

4.5 编程陷阱

陷阱1:“”“doc”“”,三对双引号中内容带引号,没去除引号被当做字符内容,导致Solution算法“失灵”。

doc = """ABC "efg" HIGK"""  # efg带引号
doc.split()                 # 分割后'"efg"'而不是'efg',不注意还看不出来

['ABC', '"efg"', 'HIGK']

避坑办法:.replace(‘"’,‘’)去除内容引号

def get_test_cases(str_examples):
    import re
    params =re.split('Example.+?:',str_examples.replace('\n','').replace(' ',''))[1:]
    cases_arg, cases_ans = [], []
    for param in params:
        kawargs = {}
        args_,ans = param.split('Output:')
        args_ = args_.replace('Input:','').strip().split(',')
        # ans.replace('"','')
        cases_ans.append(ans.replace('"','')) 
        for arg in args_:
            key,val = arg.split("=")
             # val.replace('"','')
            kawargs[key] = val.replace('"','')
        cases_arg.append(kawargs)
    return zip(cases_arg, cases_ans)

陷阱2:try…except不仅捕获assert断言成功失败,在try中print(kawargs,answer),‘kawargs’写错也导致进入except块。

避坑办法:try…except Exception as e打印异常,debug错误

# 捕获except异常并不等于assert断言失败
try:
    print(what)
    assert 1==1
except Exception as e:
    print(e)

name 'what' is not defined

def auto_test(test_cases):
    f = getattr(Solution(), dir(Solution())[-1])
    try:
        for kwargs, answer in test_cases:
            print(kwargs,answer)
            assert f(**kwargs) == answer        
        return 'Accepted'
    except Exception as e:  
        print(e)
        return 'Wrong Answer'

避坑办法:头一次掉这坑,刷新zip认知,记住它。

4.6 再次测试

test_cases = get_test_cases(str_Examples)
auto_test(test_cases)

{'str1': 'ABCABC', 'str2': 'ABC'} ABC
{'str1': 'ABABAB', 'str2': 'ABAB'} AB
{'str1': 'LEET', 'str2': 'CODE'} 
{'str1': 'ABCDEF', 'str2': 'ABC'} 

'Accepted'

auto_test(get_test_cases(str_Examples))

{'str1': 'ABCABC', 'str2': 'ABC'} ABC
{'str1': 'ABABAB', 'str2': 'ABAB'} AB
{'str1': 'LEET', 'str2': 'CODE'} 
{'str1': 'ABCDEF', 'str2': 'ABC'} 

'Accepted'

5. 总结

step1: 在Jupyter notebook中编写LeetCode问题解答代码

class Solution: def method(self,**kwargs):

step2: 复制LeetCode中Example内容复制给变量str_Examples
step3: 使用get_test_cases获取测试用例
step4: 调用auto_test进行自动测试,返回’Accepted’所有测试用例通过,'Wrong Answer’表示存在没能通过的用例。

LeetCode问题Description中所有Example测试通过,即Run Code结果为’Accepted’,并不代表Submit后的结果一定会为’Accepted’。相反,Run Code结果为’Wrong Answer’,那么Submit后结果一定是’Wrong Answer’。因为Description中的Example只是部分示例,是Submit后验证的测试用例集合的子集。

def get_test_cases(str_examples):
    import re
    params =re.split('Example.+?:',str_examples.replace('\n','').replace(' ',''))[1:]
    cases_arg, cases_ans = [], []
    for param in params:
        kawargs = {}
        args_,ans = param.split('Output:')
        args_ = args_.replace('Input:','').strip().split(',')
        # ans.replace('"','')
        cases_ans.append(ans.replace('"','')) 
        for arg in args_:
            key,val = arg.split("=")
             # val.replace('"','')
            kawargs[key] = val.replace('"','')
        cases_arg.append(kawargs)
    return zip(cases_arg, cases_ans)

def auto_test(test_cases):
    f = getattr(Solution(), dir(Solution())[-1])
    try:
        for kwargs, answer in test_cases:
            print(kwargs,answer)
            assert f(**kwargs) == answer        
        return 'Accepted'
    except Exception as e:  
        print(e)
        return 'Wrong Answer'

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


全套资料获取方式:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化时代,在一系列数据技术中浅谈商业智能BI

BI&#xff0c;Business Intelligence的简称&#xff0c;顾名思义&#xff0c;也叫做商业智能。其主要价值&#xff0c;在于通过一系列的数据技术&#xff0c;从数据中挖掘隐藏的客观规律&#xff0c;总结这些规律背后的原因&#xff0c;并用于指导公司业务的发展。 大多数情况…

Rust in Action笔记 第五章 深入理解数据

如果希望看到f32类型的数转换成整型数字u32类型&#xff0c;需要在unsafe包裹下调用std::mem::transmute(data)&#xff0c;因为在安全的Rust语法中没有把整型数据按照bit转换成浮点数据的实现&#xff0c;如果想要看到浮点数的二进制输出&#xff08;通过{:b}&#xff09;&…

huggingface lfs下载小技巧

先clone下来&#xff0c;然后再git lfs pull 明显要快得多。

NLP学习笔记九-机器翻译-seq2seq模型

NLP学习笔记九-机器翻译-seq2seq模型 seq2seq模型是做机器翻译任务的&#xff0c;根据名字其实我们也能有一些推测seq 2 seq&#xff0c;其实就是sequence to sequence&#xff0c;从一个序列到另一个序列&#xff0c;所以seq2seq模型其实不止可以做机器翻译&#xff0c;还可以…

跟国内这几个名校MBA项目学费比,浙大就是小弟弟……

MBA学费这些年来一直都是牵绊考生心绪的一个重要因素&#xff0c;在每年此起彼伏的调价声浪中&#xff0c;上岸时间的早或晚往往意味着成本方面看得见的增加&#xff0c;在去年的MBA招录过程中&#xff0c;部分院校也调整了相关学费&#xff0c;浙大MBA项目以33.6万的学费也跻身…

【从零开始学Django篇001】从创建一个新的Django项目开始

&#x1f341;前言 &#x1f451;作者主页&#xff1a;&#x1f449;CSDN丨博客园 &#x1f3c6;学习交流&#xff1a;&#x1f449;在下周周ovoの社区 &#x1f48e;从零开始学Django系列专栏&#xff1a;&#x1f449;Django系列专栏 ​ 在这个专栏&#xff0c;大概会从零开始…

后端-基于JdbcTemplate的数据库连接和使用

1、application.properties中进行数据库配置 spring.datasource.single.urlxxxx?useUnicodetrue&characterEncodingutf-8 spring.datasource.single.usernamexxx spring.datasource.single.passwordxxx spring.datasource.single.typecom.alibaba.druid.pool.DruidDataSou…

如何通过自养号测评在TEMU跨境电商平台中获取更大市场份额

2023年可谓是TEMU跨境电商平台的元年。自从2022年8月17日拼多多宣布将筹备跨境电商平台以来&#xff0c;TEMU犹如烈火燎原&#xff0c;迅速蔓延全球。9月1日&#xff0c;首站TEMU在北美市场正式上线&#xff0c;平台名称取意“Team Up&#xff0c;Price Down”&#xff0c;紧扣…

Easyui05补充

1.后台. 今天我们的主要任务是完成增加功能&#xff1b; 1.1BookDao. 1.2BookAddServlet. 注意&#xff0c;这里创建 Book对象赋值的时候&#xff0c;如果调用构造函数&#xff0c;那么所调用的构造函数里面 bookName属性赋值的时候必须调用 setBookName方法进行赋值&#xf…

从零开始Vue项目中使用MapboxGL开发三维地图教程(二)Mapbox地图样式

Mapbox地图样式 1、Mapbox地图样式定义2、Mapbox默认地图样式3、Mapbox地图样式对象4、切换地图样式的案例 1、Mapbox地图样式定义 Mapbox地图样式&#xff1a;按照Mapbox地图样式规范中描述的模式定义的一个JSON对象&#xff0c;或者是此类JSON的URL。可以接受null值以允许手动…

【图像处理】图像白平衡处理

一、说明 这就是我们今天要说的——图像增强&#xff01;图像增强由一组用于优化图像的技术组成。这样&#xff0c;图像在视觉上变得更容易被人类感知&#xff0c;这反过来将进一步促进改进的图像处理分析。图像增强处理技术包括以下几种&#xff1a; 傅里叶变换 白平衡 直方…

python开发的连连看小游戏

说明&#xff1a; 1.在网上找了一个基础版本改进而来&#xff0c;大概增加了200行代码&#xff0c;相对原版要复杂了一些&#xff1b; 2.界面采用tkinter开发&#xff0c;比较简单&#xff1b; 3.新增了连接连功能&#xff1b; 4.新增了积分功能&#xff1b; 5.新增了陷入…

python套接字(一):socket的使用

文章目录 前言一、什么是套接字&#xff1f;二、python中套接字的常用方法三、使用1、服务器端代码2、客户端代码 前言 最近研究了一下python的socket的使用&#xff0c;特此记录下来&#xff0c;方便以后参考。 一、什么是套接字&#xff1f; 套接字(Socket)&#xff0c;就…

线上展览平台平台有哪些?蛙色3D虚拟展厅平台简介

导语&#xff1a; 随着科技的飞速发展和全球化的趋势&#xff0c;线上展览平台正日益受到关注和重视。它们成为了传统展览方式的有力补充&#xff0c;为各行业提供了一个全新的展示和交流平台。 我们将一起探索当今主流的线上展览平台&#xff0c;并重点介绍蛙色3D虚拟展厅平台…

jmeter如何将上一个请求的结果作为下一个请求的参数

目录 1、简介 2、用途 3、下载、简单应用 4、如何将上一个请求的结果作为下一个请求的参数 1、简介 在JMeter中&#xff0c;可以通过使用变量来将上一个请求的结果作为下一个请求的参数传递。 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测…

网络安全(黑客)怎么自学?

最近看到很多问题&#xff0c;都是小白想要转行网络安全行业咨询学习路线和学习资料的&#xff0c;作为一个培训机构&#xff0c;学习路线和免费学习资料肯定是很多的。机构里面的不是顶级的黑阔大佬就是正在学习的同学&#xff0c;也用不上这些内容&#xff0c;每天都在某云盘…

Win10系统怎么设置滑动打开组合框?

Win10系统怎么设置滑动打开组合框&#xff1f;Win10系统戏中用户想要设置一下滑动打开组合框&#xff0c;但不知道怎么操作&#xff0c;用户需要打开Win10系统的高级系统设置选项&#xff0c;点击高级选项找到视觉效果选项&#xff0c;勾选滑动打开组合框选项保存即可。 解决方…

Unity入门3——脚本基础

一、生命周期函数 ​ 所有继承 MonoBehavior 的脚本&#xff0c;最终都会挂载到 GameObject 游戏对象上 ​ 生命周期函数就是该脚本对象依附的 GameObject 对象从出生到消亡整个生命周期中 ​ 会通过反射自动调用的一些特殊函数 ​ Unity 帮助我们记录了一个 GameObject 对象依…

OpenShift Route 的实现原理

OpenShift Route 的实现原理 OpenShift 如何使用 HAProxy 实现 Router 和 RouteRouter appHAProxy 配置1. HTTP2. HTTPS OpenShift 中的 Route 解决了从集群外部访问服务的需求&#xff0c;与 Kubernetes 中的 Ingress 类似。 OpenShift 中 Route 资源 API 定义如下&#xff1…

解剖学关键点检测方向论文翻译和精读:基于热力图回归的CNN融入空间配置实现关键点定位

解剖学关键点检测方向论文翻译和精读&#xff1a;Integrating spatial configuration into heatmap regression based CNNs for landmark localization Abstract: In many medical image analysis applications, only a limited amount of training data is available due to t…