Python 단위 테스트 프레임워크(상속, 단위 테스트 매개변수화, 어설션, 테스트 보고)

1. 상속

상속으로 어떤 문제를 해결할 수 있습니까?

단위 테스트의 각 모듈은 전제 조건과 청소를 사용해야 합니다. 수백 개의 모듈이 있으면 도메인 이름과 브라우저를 변경해야 하며 작업 부하가 매우 번거로울 것입니다. 이때 상속의 아이디어를 사용하여 한 번만 변경

전제와 정리를 별도의 파일에 넣을 수 있습니다. 구체적인 코드는 다음과 같습니다.

from selenium import webdriver
import unittest

class Init(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('http://www.baidu.com')
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

그런 다음 테스트 케이스를 작성할 때 상속할 수 있습니다. 구체적인 코드는 다음과 같습니다.

from selenium import webdriver
import unittest

from 单元测试框架.test.init import Init
class BaiduTest(Init):
    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

    def test_baidu_url(self):
        '''百度测试:验证百度首页的url'''
        assert self.driver.current_url=='https://www.baidu.com/'

    def test_baidu_video(self):
        '''百度测试:验证点击视频后跳转到视频的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('视频').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

    def test_baidu_map(self):
        '''百度测试:验证点击地图后跳转到地图的页面'''
        nowhandler=self.driver.current_window_handle
        self.driver.find_element_by_link_text('地图').click()
        allhandlers=self.driver.window_handles
        for handler in allhandlers:
            if handler!=nowhandler:
                self.driver.switch_to.window(handler)
                self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
                self.driver.close()
        self.driver.switch_to.window(nowhandler)

if __name__ == '__main__':
    unittest.main()
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

2. 파라미터화

unittest 테스트 프레임워크에서 매개변수화에 사용되는 라이브러리는 다음과 같습니다.

매개변수화:

서로 다른 테스트 시나리오에 동일한 테스트 단계를 적용한 다음 매개변수화를 사용할 수 있습니다.

해결할 수 있는 문제는 적은 양의 테스트 코드를 사용하여 더 많은 테스트 시나리오를 다룰 수 있다는 것입니다.

예를 들어 sina 사서함의 로그인 모듈을 테스트해 보겠습니다. 코드는 다음과 같습니다.

from selenium import webdriver
import unittest
import time as t
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()
    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,'请输入邮箱名')

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys('qwert')
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,'您输入的邮箱名格式不正确')

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户不匹配'''
        self.driver.find_element_by_id('freename').send_keys('[email protected]')
        self.driver.find_element_by_id('freepassword').send_keys('asdfg')
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,'登录名或密码错误')

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

로그인 모듈은 주로 사용자 이름과 비밀번호의 입력 형식 확인과 오류 메시지 확인을 위한 모듈이므로 사용자 이름, 비밀번호, 오류 메시지 확인을 매개변수화할 수 있습니다.구체적인 구현 코드는 다음과 같습니다. :

 from selenium import  webdriver
import  unittest
import  time as t
from parameterized import  parameterized,param
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    @parameterized.expand([
        param('','','请输入邮箱名'),
        param('wertasd', 'asdf', '您输入的邮箱名格式不正确'),
        param('[email protected]', 'asdf', '登录名或密码错误')
    ])
    def test_sina_login(self,username,password,result):
        self.driver.find_element_by_id('freename').send_keys(username)
        t.sleep(3)
        self.driver.find_element_by_id('freepassword').send_keys(password)
        t.sleep(3)
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,result)

3. 주장

assertEqual

assertEqual()은 두 값이 동일한지, 값의 데이터 유형과 내용도 동일한지 확인하는 것입니다. 예제 코드를 참조하세요.

from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

    def test_baidu_title(self):
        '''百度测试:验证百度首页的title'''
        # assert self.driver.title=='百度一下,你就知道'
        self.assertEqual(self.driver.title,'百度一下,你就知道')

어설트트루

반환 유형은 bool, 즉 테스트 중인 개체를 확인하는 것입니다. 반환 유형이 boolean이고 true이면 결과 확인이 통과됩니다. 그런 다음 assertFlase() 메서드는 테스트 중인 개체가 반환한 내용이 false인지 확인합니다. . 예제 코드를 참조하십시오.

from selenium import webdriver
import unittest
import time as t
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_isLogin(self):
        '''sina邮箱验证,判断自动登录是否勾选'''
        isLogin=self.driver.find_element_by_id('store1')
        self.assertTrue(isLogin.is_selected())

assertIn

assertIn()의 값은 어떤 값이 다른 값에 포함되는지 여부인데, 여기서 assertIn() 메서드에는 두 개의 매개변수가 있으므로 값을 포함하는 것이 실제로는 첫 번째 실제 두 번째 매개변수가 포함된다는 점을 강조하고 싶습니다. 첫 번째 실제 매개변수. 반대 방법은 assertNotIn()입니다. 예제 코드를 참조하세요.

import unittest
from selenium import webdriver
class UiTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://www.baidu.com')
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
def test_baidu_title_001(self):
self.assertIn('百度',self.driver.title)
def test_baidu_title_002(self):
self.assertIn('百度⼀下,你就知道',self.driver.title)
if __name__ == '__main__':
unittest.main()

4. 시험성적서

unittest 프레임워크에서 테스트 보고서를 생성하려면 HTMLTestRunner가 필요합니다.

import unittest
import os
from 单元测试框架.HTMLTestRunner import HTMLTestRunner #从HTMLTestRunner模块调用HTMLTestRunner类

def getTests():
    '''加载所有的测试模块'''
    suite=unittest.TestLoader().discover(
        #找到被执行模块的路径
        start_dir=os.path.dirname(__file__),
        #加载路径下所有以test_开头的测试模块的文件
        pattern='test_*.py' #正则表达式
    )
    return suite

def runSuite():
    unittest.TextTestRunner().run(getTests())

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))#获取当前目录的上级目录

def run():
    fp=open(os.path.join(base_dir(),'report','report.html'),'wb')#拼接report.html的路径 wb 二进制的方式写入
    runner=HTMLTestRunner(
        stream=fp,  #流 执行一个写入一个
        title='UI自动化测试报告',
        description='' 
    )
    runner.run(getTests())

if __name__ == '__main__':
    run()

매번 생성된 테스트 보고서가 이전 테스트 보고서를 포함하지 않고 동시에 유지되는 문제를 해결하는 방법:

솔루션: 타임스탬프를 얻기 위해 시간 라이브러리를 도입합니다.

아래와 같이 코드 쇼:

import time
import unittest
import os
from HTMLTestRunner import HTMLTestRunner

def getTests():
    '''加载所有的测试模块'''
    suite=unittest.TestLoader().discover(
        #找到被执行模块的路径
        start_dir=os.path.dirname(__file__),
        #加载路径下所有以test_开头的测试模块的文件
        pattern='test_*.py' #正则表达式
    )
    return suite

def getNowTime():
    return time.strftime('%y-%m-%d %H-%M-%S',time.localtime(time.time()))

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))

def run():
    fp=open(os.path.join(base_dir(),'report',getNowTime()+'report.html'),'wb')
    runner=HTMLTestRunner(
        stream=fp,
        title='UI自动化测试报告',
        description=''
    )
    runner.run(getTests())

if __name__ == '__main__':
    run()

이러한 방식으로 테스트 보고서가 실행될 때마다 생성됩니다.

다음은 지원 학습 자료입니다.[소프트웨어 테스트]를 하는 친구에게 가장 포괄적이고 완전한 준비 창고가 되어야 합니다.이 창고는 또한 가장 어려운 여정을 함께했습니다.당신에게도 도움이 되기를 바랍니다!

소프트웨어 테스트 인터뷰 애플릿

소프트웨어 테스트 문제 은행은 수백만 명의 사람들이 최대로 채웠습니다! ! ! 누가 알겠어! ! ! 전체 네트워크에서 가장 포괄적인 퀴즈 미니 프로그램으로, 지하철이나 버스에서 휴대폰을 사용하여 퀴즈를 풀 수 있습니다.

다음 인터뷰 질문 섹션이 다룹니다.

1. 소프트웨어 테스팅의 기초이론, 2. 웹, 앱, 인터페이스 기능 테스팅, 3. 네트워크, 4. 데이터베이스, 5. 리눅스

6. 웹, 앱, 인터페이스 자동화, 7. 성능 테스트, 8. 프로그래밍 기본 사항, 9. 시간 인터뷰 질문, 10. 공개 테스트 질문, 11. 보안 테스트, 12. 컴퓨터 기본 사항

정보 획득 방법:

추천

출처blog.csdn.net/IT_LanTian/article/details/132286849