在这篇文章中,我们将带领您了解unittest.py无法与trace.py配合使用-为什么?的全貌,包括python无法pip的相关情况。同时,我们还将为您介绍有关assertRaises为什么不使用
在这篇文章中,我们将带领您了解unittest.py无法与trace.py配合使用-为什么?的全貌,包括python无法pip的相关情况。同时,我们还将为您介绍有关assertRaises为什么不使用python unittest捕获我的属性错误?、C#Transform类的介绍与Unity配合使用、pycharm 右键无法显示 unittest 框架 && 解决右键只有 unittest 运行如何取消右键显示进行普通 run、Pytest和Unittest在Python中的区别是什么?的知识,以帮助您更好地理解这个主题。
本文目录一览:- unittest.py无法与trace.py配合使用-为什么?(python无法pip)
- assertRaises为什么不使用python unittest捕获我的属性错误?
- C#Transform类的介绍与Unity配合使用
- pycharm 右键无法显示 unittest 框架 && 解决右键只有 unittest 运行如何取消右键显示进行普通 run
- Pytest和Unittest在Python中的区别是什么?
unittest.py无法与trace.py配合使用-为什么?(python无法pip)
哇。我今晚发现,使用该unittest
模块编写的Python单元测试不能很好地与该trace
模块下的覆盖率分析配合使用。这是最简单的单元测试foobar.py
:
import unittestclass Tester(unittest.TestCase): def test_true(self): self.assertTrue(True)if __name__ == "__main__": unittest.main()
如果使用来运行此命令python foobar.py
,则会得到以下输出:
.----------------------------------------------------------------------Ran 1 test in 0.000sOK
大。现在,我也想执行覆盖率测试,因此我再次使用来运行它python -m trace --count -C . foobar.py
,但是现在我得到了:
----------------------------------------------------------------------Ran 0 tests in 0.000sOK
不,Python,这不行-您没有运行我的测试!似乎在trace
某种程度上破坏了unittest
测试检测机制。这是我想出的(疯狂)解决方案:
import unittestclass Tester(unittest.TestCase): def test_true(self): self.assertTrue(True)class Insane(object): passif __name__ == "__main__": module = Insane() for k, v in locals().items(): setattr(module, k, v) unittest.main(module)
从根本上讲,这是一种变通方法,可以通过伪造顶层模块的副本来对其进行抽象化,从而使顶层模块的名称无法命名。然后,我可以将该名称传递unittest.main()
给以回避对其产生的任何影响trace
。无需显示输出;看起来就像上面的成功示例。
因此,我有两个问题:
这里发生了什么?为什么要
trace
搞砸unittest
呢?有没有更容易和/或更少疯狂的方法来解决此问题?
答案1
小编典典一个更简单的解决方法是将模块的名称显式传递给unittest.main
:
import unittestclass Tester(unittest.TestCase): def test_true(self): self.assertTrue(True)if __name__ == "__main__": unittest.main(module=''foobar'')
trace``unittest
由于trace
其运行模块的负载方式而使测试发现混乱。trace
读取模块源代码,对其进行编译,然后在__name__
全局设置为的上下文中执行该模块''__main__''
。这足以使大多数模块的行为就像被称为主模块一样,但实际上并不会更改__main__
在Python解释器中注册的模块。当unittest
要求__main__
模块扫描测试用例时,它实际上trace
是从命令行调用的模块,该模块当然不包含单元测试。
coverage.py
采用的实际替换该模块称为一种不同的方法__main__
在sys.modules
。
assertRaises为什么不使用python unittest捕获我的属性错误?
我正在尝试运行此测试:self.assertRaises(AttributeError,branch[0].childrennodes)
和和branch[0
没有属性childrennodes
,因此它应该抛出anAttributeError
,assertRaises
应该捕获该属性,但是当我运行测试时,测试失败了,因为它抛出了AttributeError
。
Traceback (most recent call last): File "/home/tttt/../tttt/tests.py", line 504, in test_get_categories_branch self.assertRaises(AttributeError, branch[0].children_nodes)AttributeError: ''Category'' object has no attribute ''children_nodes''
有任何想法吗?
答案1
小编典典我认为是因为assert引发仅接受可赎回。它评估看可调用对象是否引发异常,而不是语句本身是否引发异常。
self.assertRaises(AttributeError, getattr, branch[0], "childrennodes")
应该管用。
编辑:
正如THC4k正确地说的那样,它在收集时收集语句,然后将出错,而不是在测试时。
这也是为什么我喜欢鼻子的原因,它有一个装饰器(提花器),对于这种测试有用且更清晰。
@raises(AttributeError)def test_1(self) branch[0].childrennodes
C#Transform类的介绍与Unity配合使用
主要用于物体的旋转移动和缩放
一、成员变量
position:在世界空间坐标transform的位置。
localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同于Transform.position。
eulerAngles:世界坐标系中的旋转(欧拉角)。
localEulerAngles:相对于父级的变换旋转角度。
right:世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)
up:世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。)
forward:世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)
rotation:世界坐标系中的旋转(四元数)。
localRotation:相对于父级的变换旋转角度。
localScale:相对于父级的缩放比例。
parent:父对象Transform组件。
worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。
localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。
root:对象层级关系中的根对象的Transform组件。
childCount:子对象数量。
lossyScale:全局缩放比例(只读)。
二、成员函数:
1、LookAt函数
public void LookAt(Transform target)
public void LookAt(Vector3 worldPosition);
public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
旋转物体,使物体的z轴指向target/worldPosition,对于worldUp的描述是,在完成上面的旋转之后,继续旋转自身,使得当前对象的正y轴朝向与worldUp所指向的朝向一致。
这里的朝向一致指的是新旋转后的y轴与worldUp在该对象初次旋转后的xy平面上的投影向量一致。之所以取投影是因为第一次旋转使物体的z轴指向target/worldPosition后,此时的worldUp向量可能不在xy平面上,要在z轴指向target/worldPosition前提下是y轴朝向与worldUp一致,只能取worldUp在xy平面上的投影。
注意:使用worldPosition向量时要注意方向,一定是target-transform.position,顺序反了会使物体背向目标;若使用Transform作为参数,则不必注意。默认情况下,worldUp是Vector3.up(世界坐标系下的y轴)
2、Rotate函数
public void Rotate(Vector3 eulerAngles);
public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
旋转一个欧拉角度,它按照zxy的顺序进行旋转,默认情况下局部坐标系下Space.Self
public void Rotate(Vector3 axis, float angle);
public void Rotate(Vector3 axis, float angle,Space relativeTo = Space.Self);
绕axis轴旋转angle角度,默认情况下局部坐标系下Space.Self。
transform.rotation和Rotate有个区别:
Rotate()方法是:旋转多少度。在原有的基础上累加,即旋转了多少角度。又旋转了多少角度,是在原有的基础上在旋转
rotation属性是:旋转到某个角度,就是是在update中每帧都执行。但每次旋转到的角度都是5,所以是旋转到5度。一直都是
比如你只想让他旋转到多少, 用rotation; 假如想让他一直转,可以用Rotate
rotation直接改变了数值, 以达到旋转效果
Rotate应用一个的旋转角度每秒1度慢慢的旋转物体
当然:rotation()还可以通过插值旋转
pycharm 右键无法显示 unittest 框架 && 解决右键只有 unittest 运行如何取消右键显示进行普通 run
上面是普通文件和 unittest 导入的文件右键快捷键显示情况,可以看出两者快捷键都是 ctr+shift+F10, 如果你是右键模式想运行 unitest, 但是又不知道哪里配置 unittest 直接运行快捷键 ctr+shift+F10 就会实现 unitest 执行
,如果你想取消文件 unittest 配置只需要,修改配置就可以如下点击下拉箭头点击 editconfig:
点击 defaults. 下面 python tests
选取 unitest 框架,点击添加配置加号:
修改 Name 自定义选取 script,填入对应要配置 unitest 的 py 文件脚本绝对路径,ok 保存
快捷键或者右键运行 unitetest ok:
有配置就有取消,取消 unittest 配置就是返回配置页面去掉 python tests 中配置的选项:
恢复普通 run 运行:
另外,除了上面配置除外,在 settings 下也可以实现 unittest 以及 pytest 配置:
Pytest和Unittest在Python中的区别是什么?
1.安装和使用
在安装方面, unittest肯定更好, 因为不用安装。 unittest属于
在使用上Pytest更加灵活,可以在命令行中使用各种选项来执行测试,而Unittest则需要在脚本中编写测试用例并使用Unittest模块来运行测试。这一点上Pytest加分较多。
2.编写测试用例
Pytest和Unittest在编写测试用例方面也有一些区别。相对于Unittest而言,Pytest的测试用例编写更加简洁。Pytest使用Python的assert关键字来断言测试结果,而Unittest则需要使用assertEqual、assertTrue等方法来进行断言。
下面是一个使用Pytest编写的测试用例示例,测试用例的目的是测试下面的类:
class Calculator: def add(self, a, b): return a + b def subtract(self, a, b): return a - b
如果用Pytest编写
立即学习“Python免费学习笔记(深入)”;
import pytest from Calc import Calculator @pytest.mark.parametrize("a, b, expected", [ (2, 3, 5), (0, 0, 0), (-1, 1, 0), ]) def test_calculator_add(a, b, expected): calculator = Calculator() assert calculator.add(a, b) == expected
而使用Unittest编写的相同测试用例则为:
import unittest from Calc import Calculator class TestCalculator(unittest.TestCase): def test_calculator_add(self): calculator = Calculator() self.assertEqual(calculator.add(2, 3), 5) self.assertEqual(calculator.add(0, 0), 0) self.assertEqual(calculator.add(-1, 1), 0)
Unittest必须创建测试类, 所以绝大多数场景下,讨论代码简洁性Pytest要更加的加分。 而且我们可以对比一下输出:
下面是Pytest的输出结果
============================= test session starts =============================collecting ... collected 3 itemstest_calc.py::test_calculator_add[2-3-5] PASSED [ 33%]test_calc.py::test_calculator_add[0-0-0] PASSED [ 66%]test_calc.py::test_calculator_add[-1-1-0] PASSED [100%]============================== 3 passed in 0.01s ==============================
下面是Unittest的输出结果
============================= test session starts =============================
collecting ... collected 1 item
u.py::TestCalculator::test_calculator_add PASSED [100%]
============================== 1 passed in 0.01s ==============================
对比发现,pytest会输出详细的结果, 而unittest给出的是整体的判断。 所以,从友好性上来说也是Pytest更胜一筹。
3.自动发现测试用例
Pytest能够自动发现测试用例,这意味着我们不需要手动编写代码来标识哪些测试用例应该被执行。而Unittest则需要在脚本中手动指定测试用例的执行顺序和执行方式。
4.插件和扩展
Pytest具有丰富的插件和扩展,可以用于增强测试框架的功能。而Unittest则相对简单,没有Pytest那样多的扩展。
5.运行速度
在运行速度方面,Pytest比Unittest更快。这是因为Pytest能够并行执行测试用例,而Unittest则只能按照顺序依次执行测试用例。
6.报告
Pytest和Unittest都能够生成测试报告,但是Pytest的测试报告更加友好和易读。Pytest的测试报告包含了测试用例的执行结果、时间、失败信息等,而Unittest的测试报告则相对简单。
7.社区支持
Pytest拥有一个庞大的社区支持,因此在使用Pytest时,可以轻松地找到相关的文档和解决方案。相比之下,Unittest的社区支持相对较小。
总的来说,Pytest比Unittest更加灵活、简单,并且具有更多的扩展。如果你想要快速编写测试用例并且需要更多的扩展功能,那么Pytest会是更好的选择。但是如果你需要更多的控制和精细化的测试,那么Unittest可能更加适合你。
以上就是Pytest和Unittest在Python中的区别是什么?的详细内容,更多请关注php中文网其它相关文章!
今天关于unittest.py无法与trace.py配合使用-为什么?和python无法pip的分享就到这里,希望大家有所收获,若想了解更多关于assertRaises为什么不使用python unittest捕获我的属性错误?、C#Transform类的介绍与Unity配合使用、pycharm 右键无法显示 unittest 框架 && 解决右键只有 unittest 运行如何取消右键显示进行普通 run、Pytest和Unittest在Python中的区别是什么?等相关知识,可以在本站进行查询。
本文标签: