With TestNG you can define your scenarios in testsuites (a group of related tests) in xml files. For example, we have a folder for each Scrum sprint, and in them we place one file for each User Story.
<?xml version="1.0" encoding="UTF-8"?>
<!-- US XX: As an user I want to access to the intranet with a login form in order to access to private resources -->
<suite name="IntranetLogin" enabled="true">
<test name="LoginChecking" order-by-instances="true">
<classes>
<class name="com.company.LoginTestSet" />
<methods>
<include name="loginWithExistingUser" />
<include name="loginWithNonExistingUser" />
<include name="loginWithWrongPassword" />
<include name="loginWithBlockedUser" />
<include name="loginWithEmptyFields" />
</methods>
</classes>
</test>
...
</suite>
You can define the tests steps in the javadoc of each test method so they will appear in the html documentation that is auto generated when you compile. For example:
/**
* Description: Should display an error if the user try to log in with an incorrect password
*
* Test steps:
* 1) Go to the login page
* 2) Write an username
* 3) Write an incorrect password
* 4) Click on Submit button
*
* Expected results:
* - An error message is displayed
* - The browser remains in the login page
* */
And if you want a more expressive way to write the test steps you can take a look at Doxygen.