本文目录一览:
- 做了一些Python的小练习题,如何实现自动读取txt文件中的测试数据进行测试。
- [33 关 Python 游戏,测试你的爬虫能力到底及格不?](#33 关 Python 游戏,测试你的爬虫能力到底及格不?)
- 如何学习python自动化测试
- Python题求解答!
做了一些Python的小练习题,如何实现自动读取txt文件中的测试数据进行测试。
一些经验,仅供参考:
- 方法1、可以使用CSV文件格式记录数据,这时候可以视为一种简易数据库来处理数据;
- 方法2:按行读取数据,每行进行解析;符合预定规则的则分解行信息为数据集,进行后续处理;
- 方法3:基于方法2,但有可能数据是有状态的。这时候需要记录状态信息,在状态分支里面按规则处理; 具体处理方法的选用,还是要根据源数据格式的特征分析。
# 输入参数就是源数据文件名
# 返回值就是读取出来的行集合,在后面循环从头到尾处理即可。
def getlines(fn):
f = open(fn, "r")
lines = f.readlines()
f.close()
return lines
33 关 Python 游戏,测试你的爬虫能力到底及格不?
作者 | 苏克1900 责编 | 胡巍巍 本文经授权转载自高级农民工 最近在网上看到一个非常有意思的 Python 游戏 通关网站,一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。 很考验对 Python 的综合掌握能力,比如有的闯关需要用到正则表达式,有的要用到爬虫。 我们平常学 Python 都是按章节顺序、包或者模块来学,容易前学后忘。正好可以拿这个网站来综合测试一下对 Python 的掌握情况,以便查缺补漏。 来说说这个网站怎么玩。 mark 这是网站主页面,很有 历史 感对吧,诞生了已有十几年了。但千万不要因为看着像老古董而小瞧它。 mark 我们来玩玩看,点击「get challenged」开始挑战。 第 0 关是 Warming up 热身环节: 这一关要求是修改 URL 链接,给的提示是电脑上的数学表达式:2 的 38 次方,所以大概就是需要计算出数值,然后修改url 进入下一关。 所以这关就是考 Python 的基本数值运算,你知道怎么算么? 打开 Python 自带终端,一行代码就能计算出结果:
2 ** 38
把原链接中的 0 替换为 274877906944 回车就会进入下一关: mark 游戏 这就正式开始了。图片中的笔记本给了三组字母,很容易发现规律:前面的字母往后移动两位就是后面的字母。 那么需要做的就是根据这个规律把下面的提示字符串,做位移解密得到真正的句子含义: 这道题考察字符串编码和 for 循环相关知识,代码实现如下:
s = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
result = ""
for c in s:
if c.isalpha():
if c == 'y':
result += 'a'
elif c == 'z':
result += 'b'
else:
result += chr(ord(c) + 2)
else:
result += c
print(result)
得到结果:
作者很风趣,当然不能手动去一个推算了,推荐用 string.maketrans
这个方法解决,我们上面采取的是比较直接的方法,官方给出了更为精简的方法:
import string
table = string.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:] + string.ascii_lowercase[:2])
s.translate(table)
然后把 url 中的 map 改为 ocr 回车就来到了第 2 关: mark 作者接着说过关的提示可能在书里(当然不可能了)也可能在网页源代码里。那就右键查看源代码往下拉看到绿色区域,果然找到了问题: mark 意思就是:要在下面这一大串字符里找到出现次数最少的几个字符 考察了这么几个知识点: 如果是你,你会怎么做? 来看下,十行代码快速实现:
import requests
import re
url = "http://www.pythonchallenge.com/pc/def/ocr.html"
response = requests.get(url)
content = response.text
# 提取绿色区域的文本
pattern = r'<!--(.*?)-->'
match = re.search(pattern, content, re.DOTALL)
text = match.group(1)
# 统计每个字符出现的次数
char_count = {}
for char in text:
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
# 找出出现次数最少的字符
min_count = min(char_count.values())
result_chars = [k for k, v in char_count.items() if v == min_count]
print(''.join(result_chars))
可以看到出现次数最少的就是最后几个字符,合起来是「equality」,替换 url 字符就闯过过了第 2 关进入下一关继续挑战。是不是有点意思? 后面每一关都需要用到相关的 Python 技巧解决,比如第 4 关: mark 这一关作者弄了个小恶作剧,需要手动输入数值到 url 中然后回车,你以为这样就完了么?并没有它有会不断重复弹出新的数值让你输入,貌似无穷尽。 所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 Python 了。要实现自动填充修改 url 回车跳转到新 url,循环直到网页再也无法跳转为止这一功能。 如果是你,你会怎么做? 其实,一段简单的爬虫加正则就能搞定。思路很简单,把每次网页中的数值提取出来替换成新的 url 再请求网页,循环下去,代码实现如下:
import requests
import re
url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345"
pattern = r'and the next nothing is (\d+)'
for _ in range(85):
response = requests.get(url)
match = re.search(pattern, response.text)
if match:
next_nothing = match.group(1)
url = f"http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing={next_nothing}"
else:
print(response.text)
break
输出结果如下: 可以看到,最终循环了 85 次找到了最后一个数字 16044,输入到 url 中就闯关成功。 33 关既有趣又能锻炼使用 Python 解决问题的技巧,感兴趣的话去玩玩看。 网址: 如果遇到不会做的题,可以在这里找到参考答案: 中参考文教程: 官方参考教程: 作为码一代,想教码二代却无从下手: 听说少儿编程很火,可它有哪些好处呢? 孩子多大开始学习比较好呢?又该如何学习呢? 最新的编程教育政策又有哪些呢? 下面给大家介绍CSDN新成员: 极客宝宝(ID: geek_baby) 热 文 推 荐
- ☞“年薪百万程序员遭亲妈拍卖”刚刚刷爆朋友圈!网友:是我本人!
- ☞ 真壕!腾讯员工平均月薪 7 万!
- ☞ 高级!程序员用递归来撩妹?!| 程序员有话说
- ☞厉害!女学生偷师男子学校,变身区块链开发工程师
- ☞这家公司的 IoT ,你可千万别低估!
- ☞深扒! 币安被盗的7074.18枚比特币去哪了?
- ☞如何使用「番茄法」高效的写算法题?
- ☞面对互联网一线大厂,这些技术你需要了解!
- ☞刺激!华为程序员年薪200万 ?真相让人心酸! 你点的每个“在看”,我都认真当成了喜欢
如何学习python自动化测试
目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试,本文只是自己的一点点分享,若有错误,请大家多多批评指正。这里主要介绍的是一些Python测试的框架
- 单元测试
- a、unittest :Python自带的单元测试框架
- b、pyunit:Junit的Python版本
- 使用Pyhon进行Windows GUI测试
这部分的功能主要就是和大家平时使用的QTP类似。在Windows下我们可以使用pywinauto这个开源的框架:
来个小例子:
呵呵,强大吧app.Notepad.MenuSelect("Help-About Notepad") app.AboutNotepad.OK.Click() app.Notepad.Edit.TypeKeys ("pywinauto Works!", with_spaces = True)
- 使用Python进行Web自动化测试 使用Python进行Web自动化测试的工具有很多,这里就向大家推荐一下我比较熟悉的Selenium(Web Driver)吧。 我的其他博客有关于Selenium的文章,大家可以看一下。 RF也是不错的框架啊,基于关键字驱动的 twill: a simple scripting language for Web browsing
- 使用Python进行性能测试
- a、Python Web Performance Tool
- b、Pylot
- c、Pymeter
Python题求解答!
单元测试
如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。 比如对函数abs(),我们可以编写出以下几个测试用例:
- 输入正数,比如1、1.2、0.99,期待返回值与输入相同;
- 输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;
- 输入0,期待返回0;
- 输入非数值类型,比如None、[]、{},期待抛出TypeError。 把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。 如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。 单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。 这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。 我们来编写一个Dict类,这个类的行为和dict一致,但是可以通过属性来访问,用起来就像下面这样:
d = Dict(a=1, b=2)
d['a']
1
d.a
1
mydict.py代码如下:
class Dict(dict):
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如下:
import unittest
from mydict import Dict
class TestDict(unittest.TestCase):
def test_init(self):
d = Dict(a=1, b='test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEquals(d.key, 'value')
def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEquals(d['key'], 'value')
def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。 以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。 对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEquals():
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等
另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError:
with self.assertRaises(KeyError):
value = d['empty']
通过d.empty访问不存在的key时,我们期待抛出AttributeError:
with self.assertRaises(AttributeError):
value = d.empty
运行单元测试
一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在mydict_test.py的最后加上两行代码:
if __name__ == '__main__':
unittest.main()
这样就可以把mydict_test.py当做正常的python脚本运行:
$ python mydict_test.py
另一种更常见的方法是在命令行通过参数-m unittest
直接运行单元测试:
$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。
setUp与tearDown
可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。 setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
class TestDict(unittest.TestCase):
def setUp(self):
print 'setUp...'
def tearDown(self):
print 'tearDown...'
可以再次运行测试看看每个测试方法调用前后是否会打印出setUp...和tearDown...。
小结
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。 单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。 单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。 单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。