使用Chefspec测试Kitchen集成测试:测试带有依赖项的cookbook

时间:2016-05-08 13:43:01

标签: testing chef apache-kafka apache-zookeeper chefspec

我知道Test Kitchen遵循序列

创建节点>汇合食谱>运行测试

创建假设强烈外部依赖的测试的最佳做法是什么?

一个例子是卡夫卡食谱https://supermarket.chef.io/cookbooks/kafka。您可能知道,Kafka是一个依赖Zookeeper的消息传递代理应用程序,Zookeeper是一个独立的应用程序,它是消息中心。

在正确分离关注点之后,Kafka食谱不包括Zookeeper - 它可以安装在同一主机或不同的机器中。

但是,为了在Kafka工作时进行简单验证(即创建简单消息),您需要运行Zookeeper服务器。

例如,测试可能在安装后运行这三个命令

# creates a message topic
bin/kafka-create-topic.sh --zookeeper localhost:2181 --replica 1 --partition 1 --topic test

# lists existing message topics
bin/kafka-list-topic.sh --zookeeper localhost:2181

# sends a message to this machine
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

使用Chefspec,有没有办法存根这个外部服务器(上面的localhost:2181部分)?

谢谢!

1 个答案:

答案 0 :(得分:0)

答案的两个部分:首先,ChefSpec用于单元测试,与Test Kitchen和集成测试无关。其次,您需要制作一个最小的测试配方来安装单节点ZK服务器并将其用于集成测试。通常,您可以将测试食谱放在import pygame as pg import sys import random window_wth = 720 window_hgt = 360 window_resolution = window_wth, window_hgt fps = 15 card_wth = 72 card_hgt = 92 gap_x = 77 gap_y = 97 c1 = (random.randrange(255), random.randrange(255), random.randrange(255)) c2 = (random.randrange(255), random.randrange(255), random.randrange(255)) c3 = (random.randrange(255), random.randrange(255), random.randrange(255)) c4 = (random.randrange(255), random.randrange(255), random.randrange(255)) bkg_colour = (30, 30, 30) pg.display.set_caption("Game") main_display = pg.display.set_mode(window_resolution) background = pg.Surface(window_resolution) pos_x = int((window_wth % gap_x) / 2) pos_y = int((window_hgt % gap_y) / 2) global cards class Card(object): def __init__(self, xpos, ypos, colour): super(Card, self).__init__() self.colour = colour self.xpos = xpos self.ypos = ypos self.width = 72 self.height = 92 self.rect = pg.Rect((xpos, ypos, self.width, self.height)) def make_cards(tt_pos_x, tt_pos_y): global cards cards = [] for x in range(tt_pos_x, window_wth - gap_x, gap_x): for y in range(tt_pos_y, window_hgt - gap_y, gap_y): colour = (random.randrange(255), random.randrange(255), random.randrange(255)) card = Card(x, y, colour) cards.append(card) return cards def main(): global fps_clock, main_display, cards fps_clock = pg.time.Clock() while True: if pg.mouse.get_pressed()[0]: print "mouse button pressed" pos = pg.mouse.get_pos() for card in cards: if card.rect.collidepoint(pos): cards.remove(card) for event in pg.event.get(): if event.type == pg.QUIT: sys.exit() fps_clock.tick(fps) update() def update(): global cards background.fill((0,0,0)) for card in cards: pg.draw.rect(background, card.colour, card.rect, 5) main_display.blit(background, (0,0)) pg.display.update() if __name__ == '__main__': global cards cards = make_cards(pos_x, pos_y) pg.display.update() main() 下,然后使用test/cookbook源将其添加到Berksfile中。您可以使用“真正的”ZK食谱,或者您可以使用更简单,更专注的东西。只是测试极简主义的一个例子,请参阅my MongoDB recipe。在这种情况下,你可以使用类似的东西。