Django自身提供测试类、工具-调研

Django自身提供测试类、工具

django.test.Client

他的作用是模拟客户端。
提供一系列的方法,例如get、post、delete、login等
其中login是用django自身的验证,特殊之处是实例化的Client可以拿到session、cookie【Client.cookies、Client.session

SimpleTestCase

非数据库查询的

TransactionTestCase

有数据库操作,在测试结束后直接清空数据库。

TestCase

常用的编写测试的类,他是以事务的方式回滚数据,相对来说更好。不过有些数据库不支持,就会报错。(例如,MyISAM 引擎的 MySQL)
另外如果本身要测试的类自身带有事务属性,那么在使用这个工具处理的时候也要额外做一些操作。

LiveServerTestCase

这个比较特殊,他本身和 **TransactionTestCase **差不多,区别是本类会后台启动一个 类似runserver的服务,这样就可以使用 selenium 来做对应的请求,并且在对应的操作结束后,会和 **TransactionTestCase **一样,执行结束后清空数据库.

调研初步结论

Django测试工具优点

  1. Django提供了丰富的测试工具类,特别是关于测试过程中产生的数据处理方式【不处理、全局清理、借住事务进行回滚操作】
  2. Django提供了Client类,可以模拟客户端访问Api、View并对结果进行判断,并记录上下文需要的Cookie、Session

Django缺点

  1. 如果本身不用Django编写的程序,使用Django的测试工具编写测试用例好像于pytest编写的测试用例没啥区别。
  2. 要编写大量的代码。
  3. 与selenium交互不是很理想,几乎就丧失了对Ajax、Vue等方式的测试能力。

推荐

  1. 使用ApiPost录入Swagger,并组织一下执行的顺序,来实现无界面话的接口测试。(生成接口文档、测试用例)
  2. 是用Selenium 录制动作,并生成Python pytest脚本,来执行。

ps:再做一个程序,数据库的备份和还原

Selenium

使用Selenium IDE 浏览器插件,直接录制内容,并生成 pytest脚本
image



导出脚本参考

# Generated by Selenium IDE
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 
 
class TestTest2():
    def setup_method(self, method):
        self.driver = webdriver.Chrome()
        self.vars = {}
 
    def teardown_method(self, method):
        self.driver.quit()
 
    def wait_for_window(self, timeout=2):
        time.sleep(round(timeout / 1000))
        wh_now = self.driver.window_handles
        wh_then = self.vars["window_handles"]
        if len(wh_now) > len(wh_then):
            return set(wh_now).difference(set(wh_then)).pop()
 
    def test_test2(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.set_window_size(1057, 808)
        self.driver.find_element(By.ID, "kw").click()
        self.driver.find_element(By.ID, "kw").send_keys("Python")
        self.driver.find_element(By.CSS_SELECTOR, ".bdsug-s").click()
        self.driver.find_element(By.ID, "su").click()
        self.vars["window_handles"] = self.driver.window_handles
        self.driver.find_element(By.LINK_TEXT, "Python 集中营的博客_CSDN博客-python,java算法,框架领域...").click()
        self.vars["win8739"] = self.wait_for_window(2000)
        self.driver.switch_to.window(self.vars["win8739"])
        self.vars["window_handles"] = self.driver.window_handles
        self.driver.find_element(By.CSS_SELECTOR, "div:nth-child(1) > .blog-list-box h4").click()
        self.vars["win5468"] = self.wait_for_window(2000)
        self.driver.switch_to.window(self.vars["win5468"])
        self.driver.find_element(By.CSS_SELECTOR, ".blog_extension_card_cont_l > .text").click()
        self.driver.find_element(By.CSS_SELECTOR, ".blog_weixin_box_btn > span").click()
        self.driver.find_element(By.ID, "blog_weixin_box_close").click()
posted @ 2023-07-03 16:37  百猎  阅读(36)  评论(0编辑  收藏  举报