软件测试小白自我总结 python之 selenium+unittest+MyHTMLtestrunner总结

最近在学自动化测试,加粗样式为了检测自己学的知识,整理一下,这几天的学习内容。

我在这里也就不介绍自动化测试是来干嘛的了,大神很多,说的也很详细,我也是经常来学习……
废话不多说了,直接开始主题了。

第一步 配置环境 干啥都要环境,我搭的很简单的环境
需要的环境我就一起说了,省的再后面又要提起。
webdriver 浏览器驱动 专为自动化测试。
对应自己浏览器版本下载,我这里给个某站某大佬给的链接
各个浏览器驱动下载地址
下完之后。把webdriver.exe 放在 自己电脑浏览器的Application下,这里附一下我自己的驱动。 谷歌的默认安装路径基本上都在这
C:\Users\Administrator\AppData\Local\Google\Chrome\Application
然后再把这个路径添加到系统环境变量。 这样你就可以在pycharm中不需要写webdriver的启动位置了。
(另外说一个提醒吧,也是个人经历,毕竟是小白—— win10的webdriver在配置完环境之后在pycharm运行也会运行不了, 它也会提醒是selenium下的一个service中的start方法有错误,这个解决方法很简单修改源代码

将C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\selenium\webdriver\common\service.py里的start方法下的代码

        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                        stdin=PIPE)

改为:

        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        #stdout=self.log_file,
                                        #stderr=self.log_file,
                                        stdin=PIPE)

————————————————

原文链接:https://blog.csdn.net/wjd1994/article/details/102320246 )实在不懂去这里仔细看看

再之 我用的IDE是pycharm 老老实实安装(pip)好需要的 selenium库 以及 HTMLTestRunner库 后者是需要在网上下载,下载地址在这呢!

由于unittest是python自带的库。就很方便

这是我先写的代码。 检测webdriver是否能正常运行

from selenium import webdriver
from time import sleep
# from selenium.webdriver.common.action_chains import ActionChains
# import unittest

driver = webdriver.Chrome()
# driver.implicitly_wait(5)
url="http://10.10.xxx.xxx"
driver.get(url)
sleep(2)
driver.find_element_by_link_text("登录").click()
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/input").send_keys("admin")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/input").send_keys("123456")
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[5]/td[2]/input").click()
sleep(3)
driver.quit()

其实就访问一个网页的登录页面,
在这里插入图片描述

如图, url是之前搭建的一个网址,后来我设成一个可供局域网访问的服务器,方便测试。

当时先测试这个web的会员登录模块,于是再学了点unittest框架之后,就把代码再提升了下,添加了unittest库,建立新的测试框架。

from selenium import webdriver
from time import sleep
import unittest

class TestLoginOut(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://10.10.xxx.xxx/")
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()
        print("setup")
    def test_login(self):
        driver = self.driver
        driver.find_element_by_link_text("登录").click()
        driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[1]/td/input").send_keys("admin")
        driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/input").send_keys("123456")
        driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[5]/td[2]/input").click()
        sleep(3)
        driver.find_element_by_css_selector(".reg").click()
    def tearDown(self):
        sleep(2)
        self.driver.quit()
        print("tearDown")


if __name__ == '__main__':
    unittest.main()
    

代码很简单,我说一下这里面几个关键的点(我自己看法。。
一: 首先再导入unittest库之后,定义一个类用来继承unitttest的Testcase
class名根据个人喜好,但再后面添加测试到测试容器时,还是需要class名
二: 说一下unittest下的几个常用方法, setUp() 一般用来写环境配置,程序会在这里开始执行。

tearDown() 程序会在这里执行完结束,与它们在类中的位置无关。
unittest比较人性化的是,所有你定义的方法,只要是test_开头,它会默认为这是一条测试用例方法,程序就会当作测试用例来执行。 所以,在这里命名很重要。
三:在unittest里你可以任意定义方法,也可以添加多条test用例。若是想一次添加多条用例, 可以用excel表导入,也可以用discover 方法,它里面有三个参数:

  -case_dir:这个是待执行用例的目录。
  -pattern:这个是匹配脚本名称的规则,test_.py 意思是匹配 test 开头的所有脚本。
  -top_level_dir:这个是顶层目录的名称,一般默认等于 None 就行了。
一般在与项目在用一个文件下 新建需要执行的测试用例再将其用discover方法将其批量添加,执行。

贴上我执行后的结果(由于之前这是还没考虑到对执行结果的判断,也就是unittest中最关键的一点 断言 assert方法)
在这里插入图片描述
常用断言方法:
self.assertEqual(a,b,msg=msg) #判断a与.b是否一致,msg类似备注,可以为空
self.assertNotEqual(a,b,msg=msg) #判断a与b是否不一致
self.assertTrue(a,msg=none) #判断a是否为True
self.assertFalse(b,msg=none) #判断b是否为false
self.assertSequenceEqual #有空在研究,源码很长
self.assertListEqual #有空研究
self.assertTupleEqual #有空在研究
self.assertSetEqual #有空在研究
self.assertIn(a,b) 判断a in b是否成立,正确则True,否则为False

该说的差不多都说了,以后想到什么再补充

""
version 1.5
打印测试报告(添加了断言,以及htmltestrunner)
editor wenanXu

"""
from selenium import  webdriver
import myHTMLTestRunner as HTMLTestRunner
import unittest
import time
class TestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        url = "http://10.10.xxx.xxx"
        self.driver.get(url)
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()
        print("Testing~~~~~~~\n开始测试了!")
    def tearDown(self):
        time.sleep(2)
        self.driver.quit()
        print("Downing~~~~~~~~\n测试结束了!")
    def test_1(self):
        driver = self.driver
        driver.find_element_by_link_text("登录").click()
        driver.find_element_by_css_selector("input[alt*='邮箱']").send_keys("admin")
        driver.find_element_by_css_selector("input[alt*='密码']").send_keys("123456")
        driver.find_element_by_css_selector(".submit_login").click()
        # 断言
        # str = driver.find_element_by_xpath("/html/body/div[1]/div[1]/p/text()[1]").text
        # self.assertNotAlmostEqual("admin您好,欢迎您来到iwebshop购物!]",str,msg="成功登陆!")
        str = driver.find_element_by_xpath("/html/body/div[1]/div[5]/div[2]/div[1]/b").text
        self.assertEqual("您好,admin 欢迎回来!",str,msg="登陆成功!")
        time.sleep(3)
        driver.find_element_by_css_selector(".reg").click()
        now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
        pic_path = '..\\result\\image\\' + now + '.png'
        print(pic_path)
        driver.save_screenshot(pic_path)
        time.sleep(2)
    def test_2(self):
        driver = self.driver
        driver.find_element_by_link_text("登录").click()
        driver.find_element_by_css_selector("input[alt*='邮箱']").send_keys("test")
        driver.find_element_by_css_selector("input[alt*='密码']").send_keys("test")
        driver.find_element_by_css_selector(".submit_login").click()
         # 断言
        str_2 = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/form/table/tbody/tr[2]/td/label").text
        self.assertNotEqual("填写密码",str_2,msg="请填写正确密码!")
        time.sleep(3)
        driver.find_element_by_css_selector(".reg").click()
		time.sleep(2)

if __name__ == "__main__":
    # 定义一个单元测试容器
    testsuite = unittest.TestSuite()

    # 将测试用例加入到测试容器
    testsuite.addTest(TestCase("test_1"))
    testsuite.addTest(TestCase("test_2"))

    # 获取当前时间,这样便于下面的使用。
    now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
    htmlFile = '..\\result\\'+now+'HTMLtemplate.html'
    print(htmlFile)
    # 打开一个文件,将result写入此file中
    filePath ="C://Users//Administrator//Desktop//test.html"
    fp=open(filePath ,"wb")
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='test result', description=u'result:')

    #执行测试用例
    runner.run(testsuite)

    #关闭文件
    fp.close()

我这里元素定位用的是css_selector方法,另外定位元素方法很多, 都是因人而异,用哪种习惯用哪种。

忘了说htmltestrunner了, 它的作用看名字就能知道,作为一个html显示测试report,
很直观的看到自己的测试情况。

用法很简单,调用它本身的HTMLTestRunner方法就可以。
它有三个参数,stream 文件存放位置, title 标题 , description 描述

根据自己实际情况来填写,filepath 注意转义字符

运行完之后,结果如下图所示, 很清楚发现 当我们用test用户登录时,发现无法正常登录。(另外我上面还写到了一个方法 就是将正确执行后的结果,通过save_screenshot()方法进行截图,保存位置依旧是根据自己来决定)
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值