【07节】Python3+Selenium4自动化 unittest 测试框架详解

2023-11-15

1、unittest 框架介绍

做过自动化测试的同学应该都知道python中的unittest框架,它是python自带的一套测试框架,学习起来也相对较容易,unittest框架最核心的四个概念:

  • test case:就是我们的测试用例,unittest中提供了一个基本类TestCase,可以用来创建新的测试用例,一个TestCase的实例就是一个测试用例;unittest中测试用例方法都是以test开头的,且执行顺序会按照方法名的ASCII值排序。

  • test fixure:测试夹具,用于测试用例环境的搭建和销毁。即用例测试前准备环境的搭建(SetUp前置条件),测试后环境的还原(TearDown后置条件),比如测试前需要登录获取token等就是测试用例需要的环境,运行完后执行下一个用例前需要还原环境,以免影响下一条用例的测试结果。

  • ​test suite:测试套件,用来把需要一起执行的测试用例集中放到一块执行,相当于一个篮子。我们可以使用TestLoader来加载测试用例到测试套件中。

  • test runner:用来执行测试用例的,并返回测试用例的执行结果。它还可以用图形或者文本接口,把返回的测试结果更形象的展现出来,如:HTMLTestRunner。

2、创建单元测试步骤

测试结果三种状态:测试通过 、测试失败、测试错误。

# 步骤1 - 在程序中导入unittest模块。
import unittest

# 步骤2 - 定义要测试的功能。在下面的例子中,add()函数要进行测试。
def add(x, y):
    return x + y
    
# 步骤3 - 通过对unittest.TestCase进行子类化创建测试用例。
class test_simple(unittest.TestCase):
    # 步骤4 - 将测试定义为类中的方法。方法名称必须以"test"开头。
    def testadd(self):
        # 步骤5 - 每个测试调用TestCase类的断言功能。有许多类型的断言。以下示例调用assertEquals()函数。
        # 步骤6 - assertEquals()函数将add()函数与arg2参数的结果进行比较,如果比较失败,则抛出assertionError。
        self.assertEqual(add(4, 6), 10)
        
# 步骤7 - 最后,从unittest模块调用main()方法。
if __name__ == '__main__':
    unittest.main()

# 步骤8 - 从命令行运行上述脚本。
# 步骤9 - 以下三个可能是测试的可能结果。

3、unittest 模块介绍

在 unittest 模块中定义的类和方法。该模块有五个主要类。

3.1 TestCase 类

此类的对象表示最小的可测试单元。它保存测试例程,并提供钩子来准备每个例程并在此之后进行清理。

3.1.1 TestCase 类常用方法:

. setUp():调用准备测试夹具的方法。在调用测试方法之前立即调用该方法。

tearDown():调用测试方法并记录结果后立即调用的方法。

setUpClass():在一个类运行中调用测试之前的类方法。 setUpClass以类作为唯一参数调用,并且必须修饰为classmethod()。在方法上使用@classmethod装饰器装饰。

tearDownClass():在单个类中的测试运行后调用的类方法。 tearDownClass以类作为唯一参数调用,并且必须修饰为classmethod()。在方法上使用@classmethod装饰器装饰。

run(result = None):运行测试,将结果收集到TestResult作为result传递的对象中。如果省略result或None,则将创建一个临时结果对象(通过调用该defaultTestResult() 方法)并将其使用。结果对象返回给run()的调用者。

skipTest(reason):在测试方法期间调用此方法,reason输入原因。

subTest(msg=None,**params):返回一个上下文管理器,该上下文管理器将附带的代码块作为子测试执行。 msg和params是可选的,msg可以为任意值,在子测试失败时会显示这些值,使您可以清楚地识别它们。

debug():运行测试而不收集结果。这样可以将测试引发的异常传播到调用方,并可以用来支持在调试器下运行测试。

3.1.2 TestCase 类其他方法:

"""
fail(msg=None):指定断言失败的错误信息msg
"""
    def fail(self, msg="test fail ha ha ha"):
        print("用例执行错误信息:{}".format(msg))
"""
id():获取测试方法的全名,包括模块和类名。
"""
    def test_split(self):
        print(self.id())
        print("this is a test_split method")
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)
"""
defaultTestResult():返回应用于此测试用例类的测试结果类的实例(如果未向该run()方法提供其他结果实例 )。
shortDescription():返回测试的描述,或者None没有提供描述。此方法的默认实现返回测试方法doc string的第一行(如果有)。
"""
    def test_isupper(self):
        """
        这是一个描述
        :return:
        """
        print("this is a test_isupper method")
        print(self.shortDescription())
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

3.2 setUp() 与 tearDown()

setUp() 与 tearDown() 方法在测试运行前做一些操作,测试过程会实例化浏览器、获取URL、设置等操作放在 setUp() 中;测试完成后的清除工作、关闭浏览器、数据库等放在 tearDown()中。

import unittest

class Test_Demo(unittest.TestCase):
    def setUp(self):
        print("开始执行测试用例啦!!!")

    def test_001(self):
        self.assertEqual((1 + 1 == 2), True)
        print("第一条用例")

    def test_002(self):
        self.assertEqual((2 + 3 ==5), True)
        print("第二条用例")

    def tearDown(self):
        print("每条用例执行完成显示!!")

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

3.3 setUpClass() 与 tearDownClass()

TestCase类有一个setUpClass()方法,可以在执行TestCase类中的单个测试之前被覆盖执行。类似地,tearDownClass()方法将在类中的所有测试之后执行。这两种方法都是类方法。因此,它们必须使用@classmethod指令进行装饰。

import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

class TestDemo2(unittest.TestCase):
    def setUp(self):
        print("开始执行测试用例啦!!!")

    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()

    def test_xl(self):
        sleep(3)
        self.driver.get("https://mail.sina.com.cn/")
        self.driver.find_element(By.ID, 'freename').send_keys('kasthsoft@sina.com')
        self.driver.find_element(By.ID, 'freepassword').send_keys('xxxxx')
        self.driver.find_element(By.LINK_TEXT, '登录').click()

    def test_baidu(self):
        self.driver.get("http://www.baidu.com/")
        self.driver.find_element(By.ID, 'kw').send_keys("Python Web自动化测试")
        self.driver.find_element(By.ID, 'su').click()

    @classmethod
    def tearDownClass(cls) -> None:
        sleep(3)
        # driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
        cls.driver.quit()

    def tearDown(self) -> None:
        print("每条测试执行完成啦!!")

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

3.3 TestSuite 类

Python的测试框架提供了一个有用的机制,通过这些机制可以根据测试用例的特征将测试用例实例分组在一起。该机制由Unittest模块中的TestSuite类提供。

import unittest

# 步骤1 - 创建一个TestSuite类的实例。
suite = unittest.TestSuite()

# 步骤2 - 在套件中的TestCase类中添加测试。
suite.addTest()

# 步骤3 - 您还可以使用makeSuite()方法从类添加测试
suite = unittest.makeSuite()

# 步骤4 - 还可以在套件中添加个别测试。
suite.addTest('测试方法'("测试名称"))

# 步骤5 - 创建TestTestRunner类的对象。
runner = unittest.TextTestRunner()

# 步骤6 - 调用run()方法来运行套件中的所有测试
runner.run(suite)

3.4 TestLoader 类

unittest 包具有 TestLoader 类,用于从类和模块创建测试套件。默认情况下,当unittest.main(0方法被调用)时,会自动创建unittest.defaultTestLoader 实例。然而,显式实例可以自定义某些属性。

  • loadTestsFromTestCase() 返回TestCase类中包含的所有测试用例的一套。
  • loadTestsFromModule() 返回给定模块中包含的所有测试用例的一套。
  • loadTestsFromName() 给一个字符string说明符返回一套所有测试用例。
  • loadTestsFromNames() 返回在testCaseClass中找到的方法名称的排序。

3.5 TestResult 类

此类用于编译有关已成功测试的测试和遇到故障的测试。TestResult 对象存储一组测试的结果。TestResult 实例由TestRunner.run()方法返回。

import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

class TestDemo2(unittest.TestCase):
    def setUp(self):
        print("开始执行测试用例啦!!!")

    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()

    def test_xl(self):
        sleep(3)
        self.driver.get("https://mail.sina.com.cn/")
        self.driver.find_element(By.ID, 'freename').send_keys('kasthsoft@sina.com')
        self.driver.find_element(By.ID, 'freepassword').send_keys('xxxxx')
        self.driver.find_element(By.LINK_TEXT, '登录').click()

    def test_baidu(self):
        self.driver.get("http://www.baidu.com/")
        self.driver.find_element(By.ID, 'kw').send_keys("Python Web自动化测试")
        self.driver.find_element(By.ID, 'su').click()

    @classmethod
    def tearDownClass(cls) -> None:
        sleep(3)
        # driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
        cls.driver.quit()

    def tearDown(self) -> None:
        print("每条测试执行完成啦!!")


if __name__ == '__main__':
    unittest.main()
    runner = unittest.TextTestRunner()
    test_suite = TestDemo2()
    # TestResult实例由TestRunner.run()方法返回
    result = runner.run(test_suite)
    # 包含TestCase实例和持有格式化回溯的字符string的2元组的列表。每个元组代表一个引发意外异常的测试。
    print(result.errors)
    # 包含TestCase实例和持有格式化回溯的字符string的2元组的列表。每个元组表示使用TestCase.assert *()方法明确发出故障的测试。
    print(result.failures)
    # 包含TestCase实例和两个元组的列表,包含跳过测试的原因。
    print(result.skipped)
    # 如果所有测试运行到目前为止,返回True,否则返回False。
    print(result.wasSuccessful())
    # 可以调用此方法来表明正在运行的一组测试应该被中止。
    print(result.stop())
    # 在执行任何测试之前调用一次。
    print(result.startTestRun())
    # 所有测试执行一次后调用。
    print(result.stopTestRun())
    # 到目前为止的测试总数。
    print(result.testsRun)
    # 如果设置为true,sys.stdout和sys.stderr将在被调用的startTest()和stopTest()之间缓冲。
    print(result.buffer)

4 、unittest 常用断言方法

​ 在python基础中,我们有讲过一个assert断言,使用方法比较简单,即assert 表达式, 提示信息,而unittest框架中也提供了一个自带的断言方式,主要有以下几种:

方法 检查 说明
assertEqual(arg1,arg2,msg = None) a ==b 测试arg1和arg2是否相等。如果值不相等,测试将失。
assertNotEqual(arg1,arg2,msg = None) a !=b 测试arg1和arg2不相等。如果值相等,测试将失败
assertTrue(expr,msg = None) bool(x) is True 测试expr是真的。如果为false,则测试失败
assertFalse(expr,msg =无) Bool(x) is False 测试expr是false。如果为true,则测试失败
assertIs(arg1,arg2,msg =无) a is b 测试arg1和arg2评估到同一个对象
assertIsNot(arg1,arg2,msg =无) a is not b 测试arg1和arg2不评估相同的对象
assertIsNone(expr,msg =无) x is None 测试expr是None。如果不是无,测试失败
assertIsNotNone(expr,msg = None) x is not None 测试expr不是None。如果无,测试失败
assertIn(arg1,arg2,msg =无) a in b 测试arg1在arg2中
assertNotIn(arg1,arg2,msg =无) a not in b 测试arg1不在arg2中
assertIsInstance(obj,cls,msg = None) isinstance(a,b) 测试obj是cls的一个实例
assertNotIsInstance(obj,cls,msg = None) not isinstance(a,b) 测试obj不是cls的实例
import unittest

class TestDemo(unittest.TestCase):
   def test1(self):
      self.assertEqual(4 + 5,9)
   def test2(self):
      self.assertNotEqual(5 * 2,10)
   def test3(self):
      self.assertTrue(4 + 5 == 9,"The result is False")
   def test4(self):
      self.assertTrue(4 + 5 == 10,"assertion fails")
   def test5(self):
      self.assertIn(3,[1,2,3])
   def test6(self):
      self.assertNotIn(3, range(5))

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

5、unittest 项目实战分解

5.1 TestCase 测试用例

编写测试用例前,我们需要建一个测试类继承unittest里面的TestCase类,继承这个类之后我们才是真正的使用unittest框架去写测试用例,编写测试用例的步骤如下:

  • 导入unittest模块
  • 创建一个测试类,并继承 unittest.TestCase()
  • 定义测试方法,方法名必须以test_开头
  • 调用 unittest.main() 方法来运行测试用例,unittest.main() 方法会搜索该模块下所有以 test 开头的测试用例方法,并自动执行

5.2 TestFixure 测试夹具

​ unittest的测试夹具有两种使用方式,一种是以测试方法为维度的setUp()和tearDown(),一种是以测试类为维度的setUpClass()和tearDownClass()。

代码:5.1 与 5.2 内容代码演示

import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By

class TestDemo2(unittest.TestCase):
    def setUp(self):
        print("开始执行测试用例啦!!!")

    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()

    def test_xl(self):
        sleep(3)
        self.driver.get("https://mail.sina.com.cn/")
        self.driver.find_element(By.ID, 'freename').send_keys('kasthsoft@sina.com')
        self.driver.find_element(By.ID, 'freepassword').send_keys('xxxxx')
        self.driver.find_element(By.LINK_TEXT, '登录').click()

    def test_baidu(self):
        self.driver.get("http://www.baidu.com/")
        self.driver.find_element(By.ID, 'kw').send_keys("Python Web自动化测试")
        self.driver.find_element(By.ID, 'su').click()

    @classmethod
    def tearDownClass(cls) -> None:
        sleep(3)
        # driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
        cls.driver.quit()

    def tearDown(self) -> None:
        print("每条测试执行完成啦!!")

5.3 TestSuite 测试套件

unittest.TestSuite()类来表示一个测试用例集,把需要执行的用例类或模块存到一起。

  1. unittest.TestSuite()
    addTest():添加单个测试用例方法
    addTest([…]):添加多个测试用例方法,方法名存在一个列表

  2. unittest.TestLoader()
    loadTestsFromTestCase(测试类名):添加一个测试类
    loadTestsFromModule(模块名):添加一个模块
    discover(测试用例的所在目录):指定目录去加载,会自动寻找这个目录下所有符合命名规则的测试用例

# run_test.py,与TsetDemo1.py、TsetDemo2.py同一目录下
import unittest
import TsetDemo2 # 导入 TsetDemo2 方法

# 第一步,创建一个测试套件
suite = unittest.TestSuite()

# 第二步:将测试用例,加载到测试套件中
# 方式1,添加单条测试用例
# 创建一个用例对象,注意:通过用例类去创建测试用例对象的时候,需要传入用例的方法名(字符串类型)
case = test_register.TestRegister("用例")
# 添加用例到测试套件中	
suite.addTest(case)

# 方式2,添加多条测试用例
case1 = test_register.TestRegister("用例1")
case2 = test_register.TestRegister("用例2")
# 添加用例到测试套件中
suite.addTest([case1, case2])	

# 方式3,添加一个测试用例类
# 创建一个加载对象
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(test_register.TestRegister))

# 方式4,添加一个模块
# 创建一个加载对象
loader = unittest.TestLoader()	
suite.addTest(loader.loadTestsFromModule(test_register))

# 方式5,指定测试用例的所在的目录路径,进行加载
# 创建一个加载对象
loader = unittest.TestLoader()
suite.addTest(loader.discover(r"目录路径"))

​ 通常使用方式 4、5比较多,你可以根据实际情况来运用。其中方式5,还可以自定义匹配规则,默认是会寻找目录下**test*.py文件,即所有以test开头命名的py文件。

# 方式5,指定测试用例的所在的目录路径,进行加载
# 创建一个加载对象
loader = unittest.TestLoader()
# 匹配规则:所有以test_case开头的
suite.addTest(loader.discover(r"目录路径" , pattern="test_case*.py"))

5.4 TestRunner 执行用例

​ testrunner顾名思义就是用来执行测试用例的,并且可以生成相应的测试报告。测试报告有两种展示形式,一种是text文本,一种是html格式。

# run_test.py,与TsetDemo1.py、TsetDemo2.py同一目录下
import unittest
import TsetDemo2 # 导入 TsetDemo2 方法
from HTMLTestRunner import HTMLTestRunner   # 请跳转目录 6、Unittest 生成 HTML 测试报告

# 创建测试套件
suite = unittest.TestSuite()

# 通过模块加载测试用例
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(test_register))

# 创建测试运行程序启动器
runner = HTMLTestRunner(stream=open("report.html", "wb"),  # 打开一个报告文件,将句柄传给stream
                        tester="DemoYi",                     # 报告中显示的测试人员
                        description="注册接口测试报告",     # 报告中显示的描述信息
                        title="自动化测试报告")             # 报告的标题

# 使用启动器去执行测试套件里的用例
runner.run(suite)

6、Unittest 生成 HTML 测试报告

​ html格式的就是HTMLTestRunner了,HTMLTestRunner是 Python 标准库的 unittest 框架的一个扩展,它可以生成一个直观清晰的 HTML 测试报告。使用的前提就是要下载 HTMLTestRunner.py,下载完后放在python的安装目录下的scripts目录下即可。

6.1 HTMLTestRunner 相关参数

  1. stream:指定输出的方式

  2. tester:报告中要显示的测试人员的名字

  3. description:报告中要显示的面熟信息

  4. title:测试报告的标题

  5. verbosity :表示测试报告信息的详细程度,一共三个值,默认是2

    0 (静默模式):你只能获得总的测试用例数和总的结果,如:总共100个 失败10 成功90
    1 (默认模式):类似静默模式,只是在每个成功的用例前面有个. 每个失败的用例前面有个F
    2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
    

6.2 HTMLTestRunner 下载

下载地址:HTMLTestRunnerCN 版本已经进行深度优化过后的中文版本。放心下载使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【07节】Python3+Selenium4自动化 unittest 测试框架详解 的相关文章

  • pandas Wide_to_long 后缀参数

    我对在 pandas 中使用 Wide to long 时的参数有疑问 有一个参数叫suffix我不明白 在文档中它说 后缀 str 默认 d 捕获所需后缀的正则表达式 d 捕获数字后缀 没有数字的后缀可以用否定字符类 D 指定 您还可以进
  • 使用应用程序脚本将 MS Word 文件(保存在云端硬盘中)转换为 Google 文档

    我被某些事情困住了 找不到解决办法 有没有办法使用文件 url 或 id 将存储在 Google Drive 中的 MS Word 文件转换为 Google 文档 我目前有一个电子表格 其中包含文件的网址 或者 也可以使用 python 脚
  • 最小二乘法拟合直线 python 代码

    我有一个由 X 和 Y 坐标组成的散点图 我想使用直线的最小二乘拟合来获得最佳拟合线 直线最小二乘拟合是指 如果 x 1 y 1 x n y n 是测量数据对 则最佳直线是y A Bx 这是我的Python代码 number of poin
  • 无法使用 BeautifulSoup 和 Requests 抓取下拉菜单

    我想抓取百年灵网站上的产品页面以获取各种信息 示例页面 https www breitling com gb en watches navitimer b01 chronograph 46 AB0127211C1A1 https www b
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 将一维数组转换为下三角矩阵

    我想将一维数组转换为较低的零对角矩阵 同时保留所有数字 我知道numpy tril函数 但它用零替换了一些元素 我需要扩展矩阵以包含所有原始数字 例如 10 20 40 46 33 14 12 46 52 30 59 18 11 22 30
  • 通用详细视图 ProfileView 必须使用对象 pk 或 slug 调用

    我是 Django 2 0 的新手 在访问我的个人资料页面视图时收到此错误 它适用于像这样的网址path users
  • 如何在Python代码中查找列号

    简短问题 当按上述方式调用函数时 我可以找到行号here https stackoverflow com questions 3056048 filename and line number of python script 同样 如何找到
  • Django 模型字段默认基于另一个模型字段

    我使用 Django Admin 构建一个管理站点 有两张表 一张是ModelA其中有数据 另一个是ModelB里面什么也没有 如果一个模型字段b b in ModelB为None 可以显示在网页上 值为ModelA的场a b 我不知道该怎
  • Tensorflow 不分配完整的 GPU 内存

    Tensorflow 默认分配所有 GPU 内存 但我的新设置实际上只有 9588 MiB 11264 MiB 我预计大约 11 000MiB 就像我的旧设置一样 张量流信息在这里 from tensorflow python client
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • Python 3在for循环中更改字典键的值不起作用

    我的 python 3 代码没有按预期工作 def addFunc x y print x y def subABC x y z print x y z def doublePower base exp print 2 base exp d
  • 如何正确导入主代码和模块中同时使用的模块?

    假设我有一个主脚本 main py 它导入另一个 python 文件import coolfunctions另一个 import chores 现在 假设 Coolfunctions 也使用家务活中的东西 因此我声明import chore
  • 用于多个窗口的 Tkinter 示例代码,为什么按钮无法正确加载?

    我正在编写一个程序 应该 按一下按钮即可打开一个窗口 按另一个按钮关闭新打开的窗口 我使用类 以便稍后可以将代码插入到更大的程序中 但是 我无法正确加载按钮 import tkinter as tk class Demo1 tk Frame
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 在Python中连续解析文件

    我正在编写一个脚本 该脚本使用 HTTP 流量行解析文件 并取出域 目前仅将它们打印到屏幕上 我正在使用 httpry 将流量连续写入文件 这是我用来删除域名的脚本 usr bin python import re input open r
  • 沿轴 0 重复 scipy csr 稀疏矩阵

    我想重复 scipy csr 稀疏矩阵的行 但是当我尝试调用 numpy 的重复方法时 它只是将稀疏矩阵视为对象 并且只会将其作为 ndarray 中的对象重复 我浏览了文档 但找不到任何实用程序来重复 scipy csr 稀疏矩阵的行 我
  • 如何更改matplotlib中双头注释的头大小?

    Below figure shows the plot of which arrow head is very small 我尝试了下面的代码 但它不起作用 它说 引发 AttributeError 未知属性 s k 属性错误 未知属性头宽
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐

  • R聚类分析航空公司数据(筛选出不同的客户类别)

    效果图如下 图片是将3万四千条航空公司数据用k means算法分成五个类 并通过ggplot2包作图作出来的特征属性 我们将通过不同的属性值 分析出高价值用户 低价值用户 主力用户 一般用户 潜力用户 可以分析得F M C自然是越高越好 C
  • ext3grep恢复linux下误删除的文件

    在linux下使用rm rf时千万要小心 但是总有不小心的时候 导致误删除一些文件 这里我做个试验 故意删除 data 2 txt文件 测试文件恢复 此时2 txt文件已经删除 1 安装ext3grep软件 wget http ext3gr
  • vue之路由的嵌套(父子路由)

    路由的嵌套 1 配置路由 main js文件中 import Users from components Users import UserAdd from components Users UserAdd import UserList
  • 第二章 Scala入门——让你的代码跑起来

    一 Scala的安装方法 要使用Scala 首先需要保证已经安装好了Java 8 对于Linux操作系统 Java 8已经默认安装了 而使用Windows操作系统的用户 则需要在Java官网下载安装包进行安装 请在CMD PowerShel
  • 小米解bl锁跳过168小时_红米K30S至尊纪念版秒解BL工具分享支持小米红米机型秒解BL跳过168小时...

    目前小米的新机 官方风控都默认绑定7天也就是168小时才能解锁BL 部分账号需要绑定15天才能满足条件 导致很多爱玩机的小伙伴被拒门外 并不是所有人都愿意等待官方解锁时候 而跳过168小时解锁 也成为了很多小伙伴希望的事情 本工具来自ROM
  • 操作系统CPU调度

    概述 多道程序操作系统的基础 通过在进程之间切换CPU 操作系统可以提高计算机的吞吐率 对于单处理器系统 每次只允许一个进程运行 任何其他进程必须等待 直到CPU空闲能被调度为止 CPU按一定的调度算法从就绪队列中选择一个进程 把CPU的使
  • TorchVision中使用FasterRCNN+ResNet50+FPN进行目标检测

    TorchVision中给出了使用ResNet 50 FPN主干 backbone 构建Faster R CNN的pretrained模型 模型存放位置为https download pytorch org models fasterrcn
  • PE文件资源解析(七)manifest资源的解析

    mainfest资源 在这里指的是资源类型为RT MANIFEST的资源信息 通过ResHacker看到的效果图如下 manifest资源存储编码格式是UTF 8 开始3个字节是EF BB BF 解析代码如下 UTF8 EF BB BF H
  • Java练习10:输入两个正整数m和n,求其最大公约数和最小公倍数

    辗转相除法 package com qiqi test import java util Scanner 输入两个正整数m和n 求其最大公约数和最小公倍数 辗转相除法 1 用大数m 小数n得第一个余数 2 余数为0则n为最大公约数 3 余数
  • 【数据库原理选择题1-4章】

    1 1 数据库系统概述 1 1 DB DBMS 和DBS 三者之间的关系是 A DBMS包括DB和DBS B DB 包括DBMS和DBS C 不能相互包括 D DBS包括DB和DBMS 正确答案 D 2 位于用户和操作系统之间的一层数据管理
  • VS2017 登录账户时,反复让输入密码,而一直无法登陆。

    问题描述 VS2017 登录账户时 反复让输入密码 而一直无法登陆成功 最后显示无法刷新此账户凭据 解决办法 在排除是自己账户或者网络有问题后 通过清理用户数据解决问题 具体步骤如下 使用管理员权限打开命令终端 转到VS安装目录下的 Com
  • torch中的model.eval()、model.train()详解

    个人简介 深度学习图像领域工作者 工作总结链接 https blog csdn net qq 28949847 article details 128552785 链接中主要是个人工作的总结 每个链接都是一些常用demo 代码直接复制运行即
  • 欧几里得距离(欧式距离)

    文章目录 一 定义 二 公式 一 定义 欧几里得度量 欧氏距离 Euclidean Metric Euclidean Distance 指在m维空间中两个点之间的真实距离 或者向量的自然长度 即该点到原点的距离 比如 在二维和三维空间中的欧
  • 液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

    关注 M r m a t e r i a l color Violet rm Mr material Mr material
  • FDR计算

    FDR计算 FDR的计算很简单 我折腾了一上午主要是因为遇到了以下几个问题 问题 FDR是什么 有什么用 怎么计算 我把几个模型的P值都合并成一个表了 所以每次运算FDR时 我需挑选特定的对象 我有多个模型 所以我想着要如何构建循环 FDR
  • 机器学习-人为设置函数方法和神经网络方法解决智能五子棋问题

    2 智能决策 2 1 博弈树模型算法 2 1 1 全局估算函数 此次项目中评估函数有两种 1 人为设定函数方法 更具人的经验 对一些特定的棋形在棋盘上进行检索 并且计数 最后赋予相应权值求和得到对棋盘的评价值 典型的棋形有 活一 活二 活三
  • 集成学习-理论概述

    1 集成学习概述 集成学习 ensemble learning 本身不是一个单独的机器学习算法 而是通过构建并结合多个机器学习器来完成学习任务 集成学习的特点 集成方法是一种将几种机器学习技术组合成一个预测模型的元算法 以减小方差 bagg
  • IDEA中如何导入module并成功运行

    在写Java项目的时候我们通常需要导入module 需要注意的是导入过程需要以下两大步骤 否则会出现无法运行的情况 以下我以导入 service edu 模块为例 一 将module文件拷贝到工程目录下 直接将需要导入的module文件 s
  • 李宏毅深度学习——优化方法

    记录了关于梯度的历史 SGD SGD with Momentum 防止gradient为0 SGD停止不动了 sgd with momentum 前面的移动会累加到下一步 sgd with momentum 前面的移动会累加到下一步 所以小
  • 【07节】Python3+Selenium4自动化 unittest 测试框架详解

    文章目录 1 unittest 框架介绍 2 创建单元测试步骤 3 unittest 模块介绍 3 1 TestCase 类 3 1 1 TestCase 类常用方法 3 1 2 TestCase 类其他方法 3 2 setUp 与 tea