The report by the French air accident investigation agency, the BEA, is based on analysis of the aircraft's flight data recorder and cockpit voice recorder.
This indicates that on the flight out from Germany to Spain, "Several altitude selections towards 100 ft were recorded during descent on the flight that preceded the accident flight, while the co-pilot was alone in the cockpit."
The data recorders indicate the captain had left Lubitz alone on the flight deck for less than five minutes.
On the return flight the same morning from Barcelona, Spain, to Dusseldorf, Germany, Lubitz is accused of purposely slamming Germanwings Flight 9525 into the French Alps, killing all 150 people on board, while the captain was locked out of the cockpit.
The co-pilot refused to let the captain re-enter and failed to respond to repeated contacts from air traffic controllers as the plane made its fatal descent.
Lubitz suffered from bouts of depression
and the incident sparked a global debate over how to monitor the mental health of pilots.
Changing altitude settings
The preliminary BEA report details what happened on board the Airbus A320 on both the outbound and return flights. The report and a Germanwings spokesperson both indicate that the same six crew members were on both legs of the trip.
While Lubitz was alone on the flight deck on the outbound flight, he was asked to bring the plane down to a lower altitude.
At one point, "the selected altitude decreased to 100 ft for three seconds and then increased to the maximum value of 49,000 ft and stabilized again at 35,000 ft," the report said.
Less than two minutes later, "the selected altitude was 100 feet most of the time and changed several times until it stabilized at 25,000 ft."
At this point the captain buzzed to re-enter the cockpit and the flight continued as planned to Barcelona.
Because he had already been asked to descend, Lubitz's apparent rehearsal of different altitude settings would have gone unnoticed by air traffic controllers since he did not diverge from the flight plan.
Analyst: 'It was a dry run'
Asked if there could be any innocent interpretation of the recorded events, CNN aviation analyst Miles O'Brien said, "It was a dry run, there's no question."
Despite the wildly different altitude selections, he said, the plane's altitude was going down at a steady rate, so the captain and air traffic controllers would not have been alerted to what Lubitz was doing.
He was presumably testing the parameters of what the aircraft's systems would allow, said O'Brien.
"On the Airbus, you have a computer system that tends to overrule what the pilot wants to do if it's outside the boundaries of acceptability for the aircraft and safety, and so this would be a good way to test where the alarm bells might go off, so you could set the selection for the intent, which of course we all know what happened," he said.
Violent blows on cockpit door
The report also provides chilling detail of the final minutes in the cockpit on the return flight before the crash.
During the fatal descent, French air traffic controllers called the flight crew 11 times on three different frequencies without any response, it said. The French military defense system also tried three times to contact the aircraft, without any answer.
The 34-year-old captain, who had left the cockpit after the plane reached its cruising altitude of 38,000 feet, buzzed to re-enter the cockpit just over four minutes later.
The cockpit voice recorder then picks up what sounds like knocking on the door half a dozen times, the sound of a muffled voice asking for the door to be opened, and then what sounds like repeated violent blows on the door.
The plane crashes into the mountainside about half a minute later.