这个问题出现在Selenium的背景下,但它确实是关于生产质量的内部测试"软件一般。
基本上,Selenium有两件事我在讨论是否需要内部测试,如果需要,最好如何实施测试。 (通过内部测试,我的意思是在脚本或库本身内实现的测试;不是专用的单元测试。)
try:
my_element = driver.find_element_by_xpath('some_xpath')
except NoSuchElementException:
pass
或者,像这样(参见例如selenium testing w/find_elements
):
try:
my_multiple_elements = driver.find_elements_by_xpath('some_xpath')
if (my_multiple_elements > 0):
# success
else:
raise Exception()
except NoSuchElementException:
raise Exception()
如果我们假设我们只查找单个事件,那么更好的内部测试?如果目标站点发生变化,以前唯一的xpath(仅返回一次)可能会返回多次出现,使find_elements
更加稳健的测试。但是时间和时间呢?运行find_elements
时的空间效率? (假设find_elements
必须解析整个文档,因此需要更长的时间。)对于一个Selenium测试,时间效率可能不是那么糟糕但是1000个呢?
class MyObject(object):
def __init__(self, x):
self.x = x
def main():
x = 5
my_obj = MyObject(5)
# TESTING
if (my_obj is None):
raise Exception()
我的问题是:为什么?它不是可能,无论多么遥远,构造函数在调用时都无法生成对象?反驳论证只是从检查对象实例化到检查变量实例化到检查所有内容都有一个滑坡吗?或者,由于空间/时间的限制,内部测试到那个程度是不必要的?
最终,一般的问题是:在编写生产质量软件时,必须测试一些东西(参见方案1)。在那种情况下,测试应该有多彻底?或者如果某些东西很可能不会失败,我是否应该对其进行测试(参见方案2)。
编辑:对代码示例进行了一些更改,以反映更强大的测试。
答案 0 :(得分:1)
你所描述的内容最好被称为"防御性编程":假设您的代码输入将破坏您对它们做出的任何假设。
因此,在您的方案1中,您永远不会知道给定时间点的给定网页是否符合您所假设的结构,或者它是否真的可以在第一时间访问。这些都是进行检查的好理由。
另一方面,检查对象实例化不在这种检查的范围内,只要它不依赖于外部条件。我们考虑过什么"外面"当然还有待讨论:如果您认为selenium服务器和浏览器是您系统的一部分并且假设它完全受到控制,那么您就不需要检查webdriver对象的成功实例化。但是,从只有你的Python进程的角度来看,selenium和浏览器也可能被认为是"在"之外,所以检查可能是有序的。在我看来,后一种态度对于可能在不可预见的条件下使用的图书馆是有意义的。
要进行总结,至少方案2非常需要找到一个良好的平衡点,而且在考虑生产代码中的检查时需要提出的问题是,特定的代码片段是否取决于某种类型的输入你做的假设。