unittest是Python内置的单元测试框架,主要用于单元测试,具备编写用例、组织用例、执行用例、输出报告等作用。
单元测试是通过一段代码去验证另一段代码,所以不用单元测试框架也能编写单元测试,但使用框架会更加规范与便捷。单元测试框架的优点:1、提供用例组织与执行;2、提供丰富的断言方法;3、提供丰富的日志。
首先,编写TestCase完成,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,最后将运行的结果保存在TextTestResult中

一个TestCase的实例就是一个测试用例,它是一个完整的测试流程。包括测试前准备环境的搭建(SetUP)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。单元测试(Unittest)的本质也就在这里,一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证。
手工测试用例:
自动化测试用例:
编写testcase前:
代码:
# 使用unittest前,需导入unittest库
import unittest
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def setUp(self):
print('前置函数,每个用例运行前会自动执行一次该函数')
def tearDown(self):
print('后置函数,每个用例运行后会自动执行一次该函数')
# 创建测试用例test_a01,用例需以test开头
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
# ---------------------------test runner部分-------------------
if __name__ == '__main__':
# 执行当前文件的测试用例
unittest.main()
执行结果:
前置函数,每个用例运行前会自动执行一次该函数
测试用例1
后置函数,每个用例运行后会自动执行一次该函数
前置函数,每个用例运行前会自动执行一次该函数
测试用例2
后置函数,每个用例运行后会自动执行一次该函数
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
注:创建用例需以test开头,实例类下面一个以test开头的函数就是一条用例。setUp()是测试用例执行前的环境准备,tearDown()是测试用例执行结束后的环境恢复,每个测试用例都会执行一次setUp()和tearDown()。
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。测试中,断言一般用于将实际结果与预期结果对比,结果一致返回true,结果不一致返回false。
代码:
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
a,b=1,1 # 设置变量a=1,b=1
self.assertEqual(a,b,'错误提示,a不等于b') # 设置断言a等于b,不相等报错并输出提示文字
print('测试用例1')
执行结果:
测试用例1
Ran 1 test in 0.001s
OK
注:断言方法前要加上self,如:self.assertEqual(a,b)
常用断言方法
| 方法 | 结果 |
|---|---|
| assertEqual(a, b) | a == b |
| assertNotEqual(a, b) | a != b |
| assertTrue(x) | bool(x) is True |
| assertFalse(x) | bool(x) is False |
| assertIs(a, b) | a is b |
| assertIsNot(a, b) | a is not b |
| assertIsNone(x) | x is None |
| assertIsNotNone(x) | x is not None |
| assertIn(a, b) | a in b |
| assertNotIn(a, b) | a not in b |
| assertIsInstance(a, b) | isinstance(a, b) |
| assertNotIsInstance(a, b) | not isinstance(a, b) |
在自动化测试中,经常会遇到部分用例无需执行的情况。当用例特别多时,一条一条注释用例或反复添加到testsuit中比较麻烦,这时可以使用unittest中的skip装饰器。
skip装饰器主要有3种:
注:condition表示满足condition条件下则跳过该用例,reason表示跳过的原因。
代码:
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
@unittest.skipIf(1,'当1为true时,跳过test_a02用例')
def test_a02(self):
print('测试用例2')
执行结果:
测试用例1
Ran 2 tests in 0.001s
OK (skipped=1)
Skipped: 当1为true时,跳过test_a02用例
在自动化测试中,一般会将测试用例(test case)和执行用例(test runner)的代码分开,写在两个不同的py文件中。这里将测试用例代码写在fff.py文件,将执行测试代码写在run_all.py文件
测试用例(fff.py文件):
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
执行测试(run_all.py文件):
testsuit使用方法一:
import unittest # 导入unittest
from static.fff import example1 # 从 static目录下的fff.py文件中导入example1实例类
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(example1('test_a01')) # 添加example1类下的用例test_a01到suite中
suite.addTest(example1('test_a02')) # 添加example1类下的用例test_a02到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
testsuit使用方法二:
import unittest # 导入unittest
from static.fff import example1 # 从 static目录下的fff.py文件中导入example1实例类
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
test_cases = [example1('test_a01'),example1('test_a02')] # 将test_a01、test_a02添加到test_cases列表
suite.addTests(test_cases) # 将test_cases列表添加到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
执行结果:
测试用例1
..
测试用例2
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
TestLoader(测试加载)一般被用来创建测试套件和搜集testcase,将搜集的testcase添加到testsuit中执行。
testloader提供了以下几种搜集testcase的方法:
| 方法名 | 作用 |
|---|---|
| unittest.TestLoader().loadTestsFromTestCase(testCaseClass) | 根据testcase类名寻找用例 |
| unittest.TestLoader().loadTestsFromModule(module, pattern=None) | 根据testcase所在的文件名寻找用例 |
| unittest.TestLoader().loadTestsFromTestCase(testCaseClass) | 根据testcase类名寻找用例 |
| unittest.TestLoader().loadTestsFromName(name, module=None) | 根据用例名称寻找用例 |
| unittest.TestLoader().loadTestsFromNames(names,module=None) | 根据多个用例名称寻找用例 |
| unittest.defaultTestLoader.discover(start_dir, pattern=‘test*.py’,top_level_dir=None) | 根据正则规则匹配路径下符合规则的文件及文件中所有的用例 |
测试用例(fff.py文件):
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
loadTestsFromTestCase 的使用方法(run_all.py文件):
unittest.TestLoader().loadTestsFromTestCase(testCaseClass)可根据testcase类名寻找用例。testCaseClass:表示test case的类名
import unittest # 导入unittest
from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromTestCase(example1) # 加载example1类下的所有用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
loadTestsFromModule 的使用方法(run_all.py文件):
unittest.TestLoader().loadTestsFromModule(module, pattern=None)可根据testcase所在的文件名寻找用例。module:表示test case所在的文件名,例如fff.py文件存放测试用例,可导入fff文件并传入使用
import unittest # 导入unittest
from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
from testcaseimport fff # 从testcase目录下导入fff文件
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromModule(fff) # 加载fff.py文件下的所有用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
loadTestsFromName 的使用方法(run_all.py文件):
unittest.TestLoader().loadTestsFromName(name, module=None)可根据用例名称寻找用例。name:表示一个string类型的参数,例如这种格式的:“module.class.method”
import unittest # 导入unittest
from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
from testcaseimport fff # 从testcase目录下导入fff文件
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromName('fff.example1.test_a01') # 加载文件名为fff,类名为example1,用例名称为test_a01的用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
loadTestsFromNames 的使用方法(run_all.py文件):
unittest.TestLoader().loadTestsFromNames(names,module=None)可根据多个用例名称寻找用例。names:表示一个list格式的参数,例:[“module.class.method”]
import unittest # 导入unittest
from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
from testcaseimport fff # 从static目录下导入fff文件
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromNames(['fff.example1.test_a01']) # 加载列表内文件名为fff,类名为example1,用例名称为test_a01的用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner()
runner.run(suite) # 将suit放入runner中执行
执行结果:
前面几个方法加载的用例都是一样的,所以运行的结果也是同一个。
测试用例1
..
测试用例2
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
defaultTestLoader.discover 的使用方法(run_all.py文件):
unittest.defaultTestLoader.discover(start_dir, pattern=‘test*.py’,top_level_dir=None)可根据正则规则匹配路径下符合规则的文件及文件中所有的用例。start_dir:代表指定目录,一般传入存放测试用例的目录路径。从指定目录开始测试模块扫描,仅加载与模式匹配的测试文件,然后返回他们的testSuite对象。pattern:代表匹配testcase文件的规则,可根据正则匹配,默认匹配指定目录下以test开头的py文件。
注:discover()方法可自动根据测试目录start_dir 匹配查找测试用例文件 test*.py ,并将查找到的测试用例组装到测试套件,因此可以直接通过 run() 方法执行 discover
目录结构:

测试用例(fff_02.py文件):
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example2(unittest.TestCase):
def test_a03(self):
print('测试用例3')
run_all.py文件:
import unittest # 导入unittest
from static.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
from static import fff # 从static目录下导入fff文件
import os
current_directory_path = os.getcwd() # 获取当前目录的路径,因为用例fff.py文件存放在当前目录下
# -------------------------test loader部分---------------------
load_case = unittest.defaultTestLoader.discover(start_dir=current_directory_path, pattern='fff*.py') # 加载当前目录下的fff开头的文件下的测试用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner(verbosity=0)
runner.run(suite) # 将suit放入runner中执行
执行结果:
测试用例1
----------------------------------------------------------------------
测试用例2
Ran 3 tests in 0.000s
测试用例3
OK
test runner(测试运行器)主要用来运行test case。可配合test suit使用,执行test suit中的用例,并将测试结果保存到TextTestResult实例中。
test runner提供了两种运行testcase的方法:
| 方法 | 简介 |
|---|---|
| unittet.main() | 执行当前文件中的所有实例类的用例,默认按照test后首字母的ascall码顺序执行 |
| unittest.TextTestRunner().run(test) | 按照test suit中存放test case的顺序执行测试用例 |
测试用例(fff.py文件):
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
unittet.main() 的使用方法(fff.py文件):
unittet.main()可执行当前文件中的所有实例类的用例,默认按照test后首字母的ascall码顺序执行。注意:这个方法一般在用例文件下面添加代码运行
# ---------------------------test runner部分-------------------
if __name__ == '__main__':
# 执行当前文件的测试用例
unittest.main()
unittest.TextTestRunner().run() 的使用方法(run_all.py文件):
unittest.TextTestRunner().run(test)一般配合test suit使用,可按照test suit中存放用例的顺序执行测试用例。注:test:表示用例或实例化的test suit。
import unittest # 导入unittest
from static.fff import example1 # 从 static目录下的fff.py文件中导入example1实例类
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromTestCase(example1) # 加载example1类下的所有用例
# --------------------------test suit部分-----------------------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 添加test load收集到的test case到suite中
# --------------------------test runner部分-------------------------------------
runner = unittest.TextTestRunner(verbosity=0) #实例化TextTestRunner类
runner.run(suite) # 将suit放入runner中执行
执行结果:
测试用例1
----------------------------------------------------------------------
测试用例2
Ran 2 tests in 0.001s
OK
注:
verbosity :表示测试结果的信息详细程,一共三个值,默认是1
测试夹具,用于测试用例环境的搭建和销毁。即用例测试前准备环境的搭建(SetUp前置条件),测试后环境的还原(TearDown后置条件),比如测试前需要登录获取token等就是测试用例需要的环境,运行完后执行下一个用例前需要还原环境,以免影响下一条用例的测试结果。
test fixture(测试夹具)有两种使用方式:
setUp()与tearDown(),简称前置与后置,它只会在每个用例执行前后执行一次。
setUp()与tearDown()的使用方法(fff.py文件):
# 使用unittest前,需导入unittest库
import unittest
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def setUp(self):
print('前置函数,每个用例运行前会自动执行一次该函数')
def tearDown(self):
print('后置函数,每个用例运行后会自动执行一次该函数')
# 创建测试用例test_a01,用例需以test开头
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
# ---------------------------test runner部分-------------------
if __name__ == '__main__':
# 执行当前文件的测试用例
unittest.main()
执行结果:
前置函数,每个用例运行前会自动执行一次该函数
测试用例1
后置函数,每个用例运行后会自动执行一次该函数
前置函数,每个用例运行前会自动执行一次该函数
测试用例2
后置函数,每个用例运行后会自动执行一次该函数
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
setupclass、teardownclass,简称类前置、类后置函数,只会在类的前后执行一次,需注意@classmethod的使用。
setUpClass与tearDownClass的使用方法:
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
'''类前、后置置函数需使用@classmethod装饰'''
@classmethod
def setUpClass(cls):
print('类前置函数,每个测试类运行前会自动执行一次该函数')
@classmethod
def tearDownClass(cls):
print('类后置函数,每个测试类运行后会自动执行一次该函数')
def setUp(self):
print('前置函数,每个用例运行前会自动执行一次该函数')
def tearDown(self):
print('后置函数,每个用例运行后会自动执行一次该函数')
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
执行结果:
类前置函数,每个测试类运行前会自动执行一次该函数
前置函数,每个用例运行前会自动执行一次该函数
测试用例1
后置函数,每个用例运行后会自动执行一次该函数
前置函数,每个用例运行前会自动执行一次该函数
测试用例2
后置函数,每个用例运行后会自动执行一次该函数
类后置函数,每个测试类运行后会自动执行一次该函数
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
参数化:主要是对测试过程中的元素定位、数据进行参数化。在自动化测试脚本的编写过程中,会需要用到数据,而数据通常是变化的、有规律的(如同:计算的公式,公式中的参数和值会变,公式本身不会变,当要对这条公式输入不同参数测试时,这时可以将参数和值进行参数化),使用参数化可以大大减少重复的代码,提高脚本的可复用性。
参数化的两种方式:
unittest 没有自带数据驱动、关键字驱动的功能,所以使用unittest参数化时,可以使用第三方库:ddt或paramunittest,这里使用ddt做演示
环境准备:
安装ddt模块,打开cmd输入
pip install ddt

ddt的使用方法(fff.py文件):
# 使用unittest前,需导入unittest库
import unittest
# 导入ddt
import ddt
# -------------------------参数化的参数-------------------
test_data = [{'username':'张三', 'psw':'123456'},
{'username': '李四', 'psw': '321654'},
{'username': '王五', 'psw': '654321'},]
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
@ddt.ddt
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
@ddt.data(*test_data)
def test_a02(self, data):
print('测试用例2')
print(data)
# ---------------------------test runner部分-------------------
if __name__ == '__main__':
# 执行当前文件的测试用例
unittest.main()
执行结果:
Ran 4 tests in 0.002s
OK
测试用例1
测试用例2
{'username': '张三', 'psw': '123456'}
测试用例2
{'username': '李四', 'psw': '321654'}
测试用例2
{'username': '王五', 'psw': '654321'}
在项目中,自动化用例测试完成后,一般需要生成自动化测试报告。unittest生成自动化测试报告可以使用第三方库:BeautifulReport或HTMLTestRunner,这里使用BeautifulReport做演示。
环境准备:
安装ddt模块,打开cmd输入
pip install BeautifulReport
测试用例(fff.py文件):
# 使用unittest前,需导入unittest库
import unittest
# ---------------------------testcase部分-------------------
# 实例化example类,并继承于unittest.TestCase
class example1(unittest.TestCase):
def test_a01(self):
print('测试用例1')
def test_a02(self):
print('测试用例2')
BeautifulReport生成测试报告的使用方法(run_all.py文件):
import unittest # 导入unittest
from testcase.fff import example1 # 从 testcase目录下的fff.py文件中导入example1实例类
from BeautifulReport import BeautifulReport # 导入BeautifulReport库
# -------------------------test loader部分---------------------
load_case = unittest.TestLoader().loadTestsFromTestCase(example1) # 加载example1类下的所有用例
# ------------------------test suit部分--------------------------
suite = unittest.TestSuite() # 构建测试套件
suite.addTest(load_case) # 将test_cases列表添加到suite中
# ------------------------生成测试报告-----------------------------
BeautifulReport(suite).report(filename='测试报告文件名称', description='测试报告标题', report_dir='.') # report_dir='.'把report放到当前目录下
执行结果:
测试用例1
..
测试用例2
测试已全部完成, 可打开 D:\Git\test\dj_test\django\项目\dailyfresh\testcase\测试报告文件名称.html 查看报告
生成的自动化测试报告:

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您