【问题标题】:How to test a webscraper in Ruby如何在 Ruby 中测试网络爬虫
【发布时间】:2020-04-06 20:38:15
【问题描述】:

我有一个任务要求我做两个测试。我有这段代码,我想使用 test-unit 进行单元测试,但我不知道该怎么做。

有什么方法可以检查测试环境中返回的数据吗?

def get_aspley_data
  url = "https://www.domain.com.au/rent/aspley-qld-4034/?price=0-900"

  unparsed_page = HTTParty.get(url)
  parsed_page    = Nokogiri::HTML(unparsed_page)
  house_listings_data = []
  house_listings = parsed_page.css('.listing-result__details')
  house_listings.each do |hl|
    prop_type      = hl.css('.listing-result__property-type')[0]
    price          = hl.css('.listing-result__price')[0]
    suburb_address = hl.css('span[itemprop=streetAddress]')[0]

    house_array = [house_listings]
    house_array.push("#{prop_type} #{price}")
    house_listings_data << [prop_type, price, suburb_address]
    puts [prop_type, price, suburb_address].to_csv(col_sep: "|")
  end
  File.open($aspley_file, "ab") do |f|
    data = house_listings_data.map{ |d| d.to_csv(col_sep: "|") }.join
    f.write(data)
  end
end

【问题讨论】:

  • 你应该问我们这是不是任务?
  • 提示:你经常想模拟外部库,尤其是。如果他们访问磁盘、网络或其他“昂贵”资源。
  • @CarlMarkham 我认为鼓励寻求帮助
  • @edvardm 谢谢,我可能会调查一下
  • 请参阅“How do I ask and answer homework questions?”。我们期待看到解决问题的有力尝试;期望我们不会编写解决方案,但会提供提示。学校非常清楚 SO 的存在,并且会寻找学生寻求答案。这对学生来说可能很糟糕。

标签: ruby testunit


【解决方案1】:

您的函数只需要一条网络信息unparsed_page = HTTParty.get(url)。如果我们 extract the parsing and saving of the page 获取页面,则所有这些都可以通过常规方式进行测试。

def parse_aspley_page(unparsed_page)
  parsed_page    = Nokogiri::HTML(unparsed_page)
  house_listings_data = []
  house_listings = parsed_page.css('.listing-result__details')
  house_listings.each do |hl|
    prop_type      = hl.css('.listing-result__property-type')[0]
    price          = hl.css('.listing-result__price')[0]
    suburb_address = hl.css('span[itemprop=streetAddress]')[0]

    house_array = [house_listings]
    house_array.push("#{prop_type} #{price}")
    house_listings_data << [prop_type, price, suburb_address]
    puts [prop_type, price, suburb_address].to_csv(col_sep: "|")
  end

  return house_listings_data
end

def save_house_listings(house_listings, file:)
  File.open(file, "ab") do |f|
    data = house_listings.map{ |d| d.to_csv(col_sep: "|") }.join
    f.write(data)
  end
end

def get_aspley_data(url, file: $aspley_file)
  save_house_listings(
    parse_aspley_page(HTTParty.get(url))
  )
end

现在parse_aspley_pagesave_house_listings可以正常进行单元测试了。

请注意,我已更改 save_house_listings 以将要写入的文件作为参数。这将使测试更容易,您可以告诉它写入临时文件,并且总体上更灵活。

get_aspley_data 现在是两个单元测试函数的瘦包装器,它们接受一个 URL。它只需要集成测试。它还将要写入的文件作为参数,默认为$aspley_file。要对其进行测试,请模拟 HTTParty.get 以返回一个页面,并告诉它写入一个临时文件。

或者,您可以设置一个小型 HTTP 服务器进行测试。但我发现重构您的代码以进行单元测试,从而使测试更简单,设计更灵活。

由于这是一项作业,您应该与您的老师确认他们希望您如何解决它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2013-04-10
    • 2012-01-14
    相关资源
    最近更新 更多