我想测试一段代码执行尽可能少的SQL查询.
ActiveRecord::TestCase似乎有自己的assert_queries方法,这将做到这一点.但是因为我没有修补ActiveRecord,所以对我来说没用.
RSpec或ActiveRecord是否提供任何官方的公共方法来计算代码块中执行的SQL查询的数量?
我们有一个异步任务,可以为对象执行可能长时间运行的计算.然后将结果缓存在对象上.为了防止多个任务重复相同的工作,我们使用原子SQL更新添加了锁定:
UPDATE objects SET locked = 1 WHERE id = 1234 AND locked = 0
Run Code Online (Sandbox Code Playgroud)
锁定仅适用于异步任务.对象本身仍可由用户更新.如果发生这种情况,旧版本对象的任何未完成任务都应丢弃其结果,因为它们可能已过时.使用原子SQL更新也很容易:
UPDATE objects SET results = '...' WHERE id = 1234 AND version = 1
Run Code Online (Sandbox Code Playgroud)
如果对象已更新,则其版本将不匹配,因此将丢弃结果.
这两个原子更新应该处理任何可能的竞争条件.问题是如何在单元测试中验证.
第一个信号量很容易测试,因为它只是用两种可能的场景设置两个不同的测试:(1)对象被锁定的位置和(2)对象未被锁定的位置.(我们不需要测试SQL查询的原子性,因为这应该是数据库供应商的责任.)
如何测试第二个信号量?在第一个信号量之后但在第二个信号量之前的某个时间,对象需要由第三方更改.这将需要暂停执行,以便可以可靠且一致地执行更新,但我知道不支持使用RSpec注入断点.有没有办法做到这一点?还是有一些其他技术我忽略了模拟这样的竞争条件?
我正在构建一个包,它提供(1)固定接口和(2)可插入驱动程序。软件包的用户可以选择所需的驱动程序。我的包将至少包含一个驱动程序,但我希望其他开发人员能够实现和验证符合包接口的驱动程序。因此,我希望这些开发人员能够针对他们的驱动程序运行我的测试。
目前,我正在使用 py.test 的参数化装置将我的驱动程序注入到我的测试中:
# conftest.py
import my_pkg
import pytest
@pytest.fixture(params=[my_pkg.MyDriver])
def driver(request):
return request.param
Run Code Online (Sandbox Code Playgroud)
# my_pkg/tests/conftest.py
import my_pkg
import pytest
@pytest.fixture
def my_interface(driver):
return my_pkg.MyInterface(driver)
Run Code Online (Sandbox Code Playgroud)
# my_pkg/tests/test_my_interface.py
def test_that_it_does_the_right_thing(my_interface):
assert my_interface.some_method() == "some return value"
Run Code Online (Sandbox Code Playgroud)
我以这种方式构建它,希望有人能够收集并针对他们的夹具版本运行我的测试driver。换句话说,他们的包看起来像这样:
# setup.py
from setuptools import setup
setup(
# ...
install_requires=["my-pkg"])
Run Code Online (Sandbox Code Playgroud)
# conftest.py
import their_pkg
import pytest
@pytest.fixture(params=[their_pkg.TheirDriver])
def driver(request):
return request.param
Run Code Online (Sandbox Code Playgroud)
显然这还不足以让它工作,因为 py.test 似乎没有提供从外部包注入测试的选项。但这怎么可能呢?
(这个问题在概念上似乎相似,但作者似乎完全在一个代码库中工作。我希望有一个完全独立的pip 安装包能够引用我的pip 安装包中包含的测试。)
我试图使用selenium与python刮取youtube评论.下面是只删除一个注释并抛出错误的代码
driver = webdriver.Chrome()
url="https://www.youtube.com/watch?v=MNltVQqJhRE"
driver.get(url)
wait(driver, 5500)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight + 500);")
driver.implicitly_wait(5000)
#content = driver.find_element_by_xpath('//*[@id="contents"]')
comm=driver.find_element_by_xpath('//div[@class="style-scope ytd-item-section-renderer"]')
comm1=comm.find_elements_by_xpath('//yt-formatted-string[@id="content-text"]')
#print(comm.text)
for i in range(50):
print(comm1[i].text,end=' ')
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出.如何获得该页面上的所有评论??? 谁能帮我这个.
Being a sucessful phyton freelancer really mean to me because if I able to make $2000 in month I can really help my family financial, improve my skill, and have a lot of time to refreshing. So thanks Qazi, you really help me :D
Traceback (most recent call last):
File "C:\Python36\programs\Web scrap\YT_Comm.py", …Run Code Online (Sandbox Code Playgroud)