def run(create_figures=False, until=42 * 42): print("Hello world!") random.seed(1) env = simpy.Environment() # the team team_skills = { "specify": simpy.Resource(env, 2), "build": simpy.Resource(env, 2), "verify": simpy.Resource(env, 2) } env.process(work_generator(env, team_skills)) env.run(until=until) print("Simulation done.") df = metrics.cycle_times(activities, time_stamps) # save cycle times to csv file: df.to_csv(output_cycle_time_file_name, index=False) if create_figures: # create cycle time figures cycle_time_figures, (ax1, ax2) = plt.subplots(nrows=2) cycle_time_figures.set_size_inches(8.27, 11.69) # A4 ax1 = metrics.cycle_time_scatter_plot(df, ax=ax1) ax2 = metrics.cycle_time_histogram_plot(df, ax=ax2) cycle_time_figures.savefig('./output/02_cycle_time_plots.pdf')
def test_retrieve_event_stream_from_cycle_time_dataframe(): timestamps = {'a': [1, 2, 3, 5, 7], 'b': [2.5, 5.7, 6.5, 8.8, 9.1]} cycle_times_df = metrics.cycle_times(['Build', 'Verify'], timestamps) stream = metrics.get_event_stream(cycle_times_df) assert len(stream) == 8 assert stream[0] == 2 # first timestamp for a.build_started
def test_cfd_dataframe_has_zeros_first_row(): timestamps = {'a': [1, 2, 3, 5, 7], 'b': [2.5, 5.7, 6.5, 8.8, 9.1]} cycle_times_df = metrics.cycle_times(['Build', 'Verify'], timestamps) df = metrics.get_cfd_dataframe(cycle_times_df) first_row_with_counts = df.iloc[0, 1:] assert np.all(first_row_with_counts == 0)
def test_started_and_completed_column_added_and_set_to_first_started_timestamp( ): timestamps = {'a user story': [1, 2, 3]} df = metrics.cycle_times(['Build'], timestamps) assert 'Started' in df.columns assert 'Completed' in df.columns assert df['Started']['a user story'] == 2 assert df['Completed']['a user story'] == 3
def test_cycle_time_flow_columns_are_at_known_location(): timestamps = {} cycle_times_df = metrics.cycle_times(['Build', 'Verify'], timestamps) cols = metrics.get_flow_columns(cycle_times_df) assert len(cols) == 4 assert cols[0] == 'Build_started' assert cols[3] == 'Verify_completed'
def test_cfd_dataframe_everything_completed_at_t_last(): timestamps = {'a': [1, 2, 3, 5, 7], 'b': [2.5, 5.7, 6.5, 8.8, 9.1]} cycle_times_df = metrics.cycle_times(['Build', 'Verify'], timestamps) df = metrics.get_cfd_dataframe(cycle_times_df) # at t_last everything is completed and all counts should be two tl_expected_counts = np.array([2, 2, 2, 2]) tl_row_with_counts = df.iloc[-1, 1:] assert (tl_expected_counts == tl_row_with_counts).all()
def test_cfd_dataframe_at_t5(): timestamps = {'a': [1, 2, 3, 5, 7], 'b': [2.5, 5.7, 6.5, 8.8, 9.1]} cycle_times_df = metrics.cycle_times(['Build', 'Verify'], timestamps) df = metrics.get_cfd_dataframe(cycle_times_df) # at t5, task a has started verify stage, but not yet completed # at t5, task b has not started, so the cunts should be t5_expected_counts = np.array([1, 1, 1, 0]) t5_row_with_counts = df.iloc[3, 1:] print(t5_expected_counts) print(t5_row_with_counts) assert (t5_expected_counts == t5_row_with_counts).all()
def test_percentiles(): timestamps = {} for i in range(1, 101): timestamps[i] = [0, 0, i] assert len(timestamps) == 100 df = metrics.cycle_times(['Build'], timestamps) assert df['Cycle_time'][1] == 1 assert df['Cycle_time'][100] == 100 percentile_values = metrics.get_percentile_values(df, (70, 85, 95)) assert abs(percentile_values[0] - 70.3) < 0.1 assert abs(percentile_values[1] - 85.2) < 0.1 assert abs(percentile_values[2] - 95.1) < 0.1
def test_returns_labels_as_column_headers(): df = metrics.cycle_times(['Specify', 'Build', 'Verify'], {}) assert 'Specify_started' in df.columns assert 'Build_completed' in df.columns
def test_returns_dataframe_from_labels_and_dictionary(): assert isinstance(metrics.cycle_times(['Build'], {}), pd.DataFrame)
def test_cycle_times_column_added(): timestamps = {'a user story': [1, 2, 3], 'a certain bug': [2, 3, 7]} df = metrics.cycle_times(['Build'], timestamps) assert 'Cycle_time' in df.columns assert df['Cycle_time']['a user story'] == 1 # 3-2 assert df['Cycle_time']['a certain bug'] == 4 # 7-3
def test_missing_timestamps_is_OK(): timestamps = {1: [1, 2, 3], 2: [2]} df = metrics.cycle_times(['Build'], timestamps) assert len(df) == len(timestamps)
def test_each_value_in_dictionary_results_in_a_row(): timestamps = {1: [1, 2, 3], 2: [2, 3, 4]} df = metrics.cycle_times(['Build'], timestamps) assert len(df) == len(timestamps)
def test_starts_with_arrival_timestamp(): df = metrics.cycle_times(['Specify', 'Build', 'Verify'], {}) assert df.columns[0] == 'Arrival'