All this behavior.
Given the specific context when an event occurs (within a certain area), then some result should occur.
A scope can be an entire application, part of a system, or a single class. Even a function behaves this way: input as a context and result as a result (you can also use BDD for a functional language!)
I use Unit modules (NUnit, JUnit, RSpec, etc.) at the class or integration level, because the audience is technical. Sometimes I document this / when / then in the comments.
At the script level, I'm trying to figure out who really wants to help read or write scripts. Even business stakeholders can read text containing several dots and brackets, so the main reason for having a natural language environment, such as MSpec or JBehave, is that they want to write scripts themselves or show them to people who will really be put off with dots and brackets.
After that, I will consider how the infrastructure will work with the build system, and how we will provide the opportunity to read or write to relevant stakeholders.
Here is an example I wrote to show what you can do with scripts using simple DSLs. It is just written in NUnit.
Here is an example in the same code base in which the data is shown, when, then in the comments at the class level.
I abstract the steps and then put screens or pages on them, then on the screens and pages I call any automatic structure that I use - these can be Selenium, Watir, WebRat, Microsoft UI Automation, etc.
The example I have given is itself an automation tool, so the scripts demonstrate the behavior of an automation tool, showing the behavior of a fake gui, in case this is confusing. Hope this helps!