我在日食时使用黄瓜和maven,我尝试做的是独立进行每项测试。例如,我有一个图书馆系统软件,基本上允许用户借书和做其他东西。
其中一个条件是用户最多只能借两本书,所以我写信以确保功能正常。这是我的专题文件:
Scenario: Borrow over max limit
Given "jim@help.ca" logs in to the library system
When "jim@help.ca" order his first book with ISBN "9781611687910"
And "jim@help.ca" orders another book with ISBN "9781442667181"
And "jim@help.ca" tries to order another book with ISBN "1234567890123"
Then jim will get the message that says "The User has reached his/her max number of books"
我写了一个相应的步骤定义文件,每一个都很棒。但是,将来我想使用相同的用户名(" jim@help.ca")来借书,就像jim@help.ca还没有借书一样。我希望每个测试彼此独立。
有没有办法做到这一点...也许我可以将某些东西放入我的步骤定义类中,例如拆解方法。我已经对它进行了调查,但我无法了解有关它的任何可靠信息。如果有办法,请帮助我。非常感谢任何帮助,我提前感谢你!
答案 0 :(得分:1)
是的,您可以在每个方案之前和之后进行设置和拆卸,但它不在步骤定义文件中。你想要使用的是钩子。
钩子在场景之前或之后运行,并且可以在每个场景之前/之后运行,或者只在你和@tag之后运行,例如:
@remove_borrowed_books
Scenario: Borrow over max limit
不幸的是我只用黄瓜和红宝石而不是java,所以我不能给你一步一步的说明,但这应该告诉你需要知道什么https://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/
答案 1 :(得分:1)
您可以使用“@After”钩子来实现这一点,因为@Derek已经提到使用例如每个用户名借用的书籍地图:
private final Map<String, Integer> booksBorrowed = new HashMap<>();
@After
public void tearDown() {
booksBorrowed.clear();
}
@Given("...")
public void givenUserBorrowsBook(String username) {
booksBorrowed.put(username, booksBorrowed.containsKey(username) ? booksBorrowed.get(username) + 1 : 1);
....
}
或“@Before”挂钩在执行每个场景之前执行清理,这是我建议的选项:
private Map<String, Integer> booksBorrowed;
@Before
public void setUp() {
booksBorrowed = new HashMap<>();
}
如果您计划并行运行场景,那么逻辑将更加复杂,因为您需要维护执行特定场景的线程与该线程上使用的用户名之间的关系。